From c7f4781137de85491cb1f0ca1ee07a6bce6b0d91 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 30 Sep 2024 16:05:06 -0500 Subject: [PATCH 01/28] spin up chat app, setup sockets, fix trigger children to work --- cli/htmgo/internal/dirutil/dir.go | 2 +- cli/htmgo/tasks/astgen/entry.go | 2 +- cli/htmgo/tasks/astgen/map.go | 4 +- examples/chat/.dockerignore | 11 + examples/chat/.gitignore | 6 + examples/chat/Dockerfile | 38 ++ examples/chat/Taskfile.yml | 20 + examples/chat/assets/css/input.css | 3 + examples/chat/chat/broadcast.go | 40 ++ examples/chat/go.mod | 12 + examples/chat/go.sum | 20 + examples/chat/main.go | 44 ++ examples/chat/pages/index.go | 93 ++++ examples/chat/pages/root.go | 22 + examples/chat/partials/index.go | 54 +++ examples/chat/tailwind.config.js | 5 + examples/chat/ws/handler.go | 44 ++ examples/chat/ws/manager.go | 80 ++++ framework/assets/dist/htmgo.js | 4 +- framework/assets/js/htmgo.ts | 1 + framework/assets/js/htmxextensions/debug.ts | 7 +- framework/assets/js/htmxextensions/htmgo.ts | 9 +- .../js/htmxextensions/trigger-children.ts | 119 +++-- framework/assets/js/htmxextensions/ws.ts | 449 ++++++++++++++++++ framework/h/attribute.go | 16 +- framework/h/lifecycle.go | 23 + framework/hx/htmx.go | 2 + framework/internal/datastructure/map.go | 4 +- framework/js/commands.go | 1 + htmgo-site/internal/datastructures/map.go | 4 +- 30 files changed, 1081 insertions(+), 58 deletions(-) create mode 100644 examples/chat/.dockerignore create mode 100644 examples/chat/.gitignore create mode 100644 examples/chat/Dockerfile create mode 100644 examples/chat/Taskfile.yml create mode 100644 examples/chat/assets/css/input.css create mode 100644 examples/chat/chat/broadcast.go create mode 100644 examples/chat/go.mod create mode 100644 examples/chat/go.sum create mode 100644 examples/chat/main.go create mode 100644 examples/chat/pages/index.go create mode 100644 examples/chat/pages/root.go create mode 100644 examples/chat/partials/index.go create mode 100644 examples/chat/tailwind.config.js create mode 100644 examples/chat/ws/handler.go create mode 100644 examples/chat/ws/manager.go create mode 100644 framework/assets/js/htmxextensions/ws.ts diff --git a/cli/htmgo/internal/dirutil/dir.go b/cli/htmgo/internal/dirutil/dir.go index 2715277..6817ac9 100644 --- a/cli/htmgo/internal/dirutil/dir.go +++ b/cli/htmgo/internal/dirutil/dir.go @@ -71,7 +71,7 @@ func MoveFile(src, dst string) error { if err != nil { return fmt.Errorf("failed to copy file: %v", err) } - // Remove the source file. + // Disconnect the source file. err = os.Remove(src) if err != nil { return fmt.Errorf("failed to remove source file: %v", err) diff --git a/cli/htmgo/tasks/astgen/entry.go b/cli/htmgo/tasks/astgen/entry.go index a057724..d14cb34 100644 --- a/cli/htmgo/tasks/astgen/entry.go +++ b/cli/htmgo/tasks/astgen/entry.go @@ -53,7 +53,7 @@ func sliceCommonPrefix(dir1, dir2 string) string { slicedDir1 := strings.TrimPrefix(dir1, commonPrefix) slicedDir2 := strings.TrimPrefix(dir2, commonPrefix) - // Remove leading slashes + // Disconnect leading slashes slicedDir1 = strings.TrimPrefix(slicedDir1, string(filepath.Separator)) slicedDir2 = strings.TrimPrefix(slicedDir2, string(filepath.Separator)) diff --git a/cli/htmgo/tasks/astgen/map.go b/cli/htmgo/tasks/astgen/map.go index 201ccea..73eb3e4 100644 --- a/cli/htmgo/tasks/astgen/map.go +++ b/cli/htmgo/tasks/astgen/map.go @@ -68,10 +68,10 @@ func (om *OrderedMap[K, V]) Values() []V { // Delete removes a key-value pair from the OrderedMap. func (om *OrderedMap[K, V]) Delete(key K) { if _, exists := om.values[key]; exists { - // Remove the key from the map + // Disconnect the key from the map delete(om.values, key) - // Remove the key from the keys slice + // Disconnect the key from the keys slice for i, k := range om.keys { if k == key { om.keys = append(om.keys[:i], om.keys[i+1:]...) diff --git a/examples/chat/.dockerignore b/examples/chat/.dockerignore new file mode 100644 index 0000000..fb47686 --- /dev/null +++ b/examples/chat/.dockerignore @@ -0,0 +1,11 @@ +# Project exclude paths +/tmp/ +node_modules/ +dist/ +js/dist +js/node_modules +go.work +go.work.sum +.idea +!framework/assets/dist +__htmgo \ No newline at end of file diff --git a/examples/chat/.gitignore b/examples/chat/.gitignore new file mode 100644 index 0000000..3d6a979 --- /dev/null +++ b/examples/chat/.gitignore @@ -0,0 +1,6 @@ +/assets/dist +tmp +node_modules +.idea +__htmgo +dist \ No newline at end of file diff --git a/examples/chat/Dockerfile b/examples/chat/Dockerfile new file mode 100644 index 0000000..7bed324 --- /dev/null +++ b/examples/chat/Dockerfile @@ -0,0 +1,38 @@ +# Stage 1: Build the Go binary +FROM golang:1.23-alpine AS builder + +RUN apk update +RUN apk add git +RUN apk add curl + +# Set the working directory inside the container +WORKDIR /app + +# Copy go.mod and go.sum files +COPY go.mod go.sum ./ + +# Download and cache the Go modules +RUN go mod download + +# Copy the source code into the container +COPY . . + +# Build the Go binary for Linux +RUN GOPRIVATE=github.com/maddalax GOPROXY=direct go run github.com/maddalax/htmgo/cli/htmgo@latest build + + +# Stage 2: Create the smallest possible image +FROM gcr.io/distroless/base-debian11 + +# Set the working directory inside the container +WORKDIR /app + +# Copy the Go binary from the builder stage +COPY --from=builder /app/dist . + +# Expose the necessary port (replace with your server port) +EXPOSE 3000 + + +# Command to run the binary +CMD ["./starter-template"] \ No newline at end of file diff --git a/examples/chat/Taskfile.yml b/examples/chat/Taskfile.yml new file mode 100644 index 0000000..695006f --- /dev/null +++ b/examples/chat/Taskfile.yml @@ -0,0 +1,20 @@ +version: '3' + +tasks: + run: + cmds: + - go run github.com/maddalax/htmgo/cli/htmgo@latest run + silent: true + + build: + cmds: + - go run github.com/maddalax/htmgo/cli/htmgo@latest build + + docker: + cmds: + - docker build . + + watch: + cmds: + - go run github.com/maddalax/htmgo/cli/htmgo@latest watch + silent: true \ No newline at end of file diff --git a/examples/chat/assets/css/input.css b/examples/chat/assets/css/input.css new file mode 100644 index 0000000..bd6213e --- /dev/null +++ b/examples/chat/assets/css/input.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go new file mode 100644 index 0000000..7ddb247 --- /dev/null +++ b/examples/chat/chat/broadcast.go @@ -0,0 +1,40 @@ +package chat + +import ( + "chat/ws" + "fmt" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" +) + +func StartListener(loader *service.Locator) { + manager := service.Get[ws.SocketManager](loader) + + c := make(chan ws.MessageEvent) + manager.Listen(c) + + for { + select { + case event := <-c: + fmt.Printf("Received message from %s: %v\n", event.Id, event.Message) + message := event.Message["message"].(string) + if message == "" { + continue + } + + messageEle := h.Div( + h.Attribute("hx-swap-oob", "beforeend"), + h.Class("flex flex-col gap-2 w-full"), + h.Id("messages"), + h.Pf(message), + ) + + manager.BroadcastText( + h.Render( + h.Fragment( + messageEle, + )), + ) + } + } +} diff --git a/examples/chat/go.mod b/examples/chat/go.mod new file mode 100644 index 0000000..8b66448 --- /dev/null +++ b/examples/chat/go.mod @@ -0,0 +1,12 @@ +module chat + +go 1.23.0 + +require github.com/maddalax/htmgo/framework v0.0.0-20240930141756-0fa096ea2f12 + +require ( + github.com/coder/websocket v1.8.12 // indirect + github.com/go-chi/chi/v5 v5.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/puzpuzpuz/xsync/v3 v3.4.0 // indirect +) diff --git a/examples/chat/go.sum b/examples/chat/go.sum new file mode 100644 index 0000000..70491aa --- /dev/null +++ b/examples/chat/go.sum @@ -0,0 +1,20 @@ +github.com/coder/websocket v1.8.12 h1:5bUXkEPPIbewrnkU8LTCLVaxi4N4J8ahufH2vlo4NAo= +github.com/coder/websocket v1.8.12/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/maddalax/htmgo/framework v0.0.0-20240930141756-0fa096ea2f12 h1:UKmSB4aTk7+FS8j2pz7ytFQQI0ihqZznG9PLqUM+2QM= +github.com/maddalax/htmgo/framework v0.0.0-20240930141756-0fa096ea2f12/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/puzpuzpuz/xsync/v3 v3.4.0 h1:DuVBAdXuGFHv8adVXjWWZ63pJq+NRXOWVXlKDBZ+mJ4= +github.com/puzpuzpuz/xsync/v3 v3.4.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/chat/main.go b/examples/chat/main.go new file mode 100644 index 0000000..2b5aed3 --- /dev/null +++ b/examples/chat/main.go @@ -0,0 +1,44 @@ +package main + +import ( + "chat/__htmgo" + "chat/chat" + "chat/ws" + "embed" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "io/fs" + "net/http" +) + +//go:embed assets/dist/* +var StaticAssets embed.FS + +func main() { + locator := service.NewLocator() + + service.Set[ws.SocketManager](locator, service.Singleton, func() *ws.SocketManager { + return ws.NewSocketManager() + }) + + go chat.StartListener(locator) + + h.Start(h.AppOpts{ + ServiceLocator: locator, + LiveReload: true, + Register: func(app *h.App) { + sub, err := fs.Sub(StaticAssets, "assets/dist") + + if err != nil { + panic(err) + } + + http.FileServerFS(sub) + + app.Router.Handle("/public/*", http.StripPrefix("/public", http.FileServerFS(sub))) + app.Router.Handle("/chat", ws.Handle()) + + __htmgo.Register(app.Router) + }, + }) +} diff --git a/examples/chat/pages/index.go b/examples/chat/pages/index.go new file mode 100644 index 0000000..bd131d5 --- /dev/null +++ b/examples/chat/pages/index.go @@ -0,0 +1,93 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/hx" + "github.com/maddalax/htmgo/framework/js" +) + +func IndexPage(ctx *h.RequestContext) *h.Page { + return h.NewPage( + RootPage( + h.Div( + h.JoinAttributes( + ", ", + h.TriggerChildren(), + h.HxExtension("ws"), + ), + h.Attribute("ws-connect", "/chat"), + h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), + Form(ctx), + h.Div( + h.Div( + h.Id("messages"), + h.Class("flex flex-col gap-2 w-full"), + ), + ), + ), + ), + ) +} + +func MessageInput() *h.Element { + return h.Input("text", + h.Id("message-input"), + h.Required(), + h.Class("p-4 rounded-md border border-slate-200"), + h.Name("message"), + h.Placeholder("Message"), + h.OnEvent("htmx:wsBeforeMessage", js.EvalJs("console.log('got message input')")), + h.HxBeforeWsSend( + js.SetValue(""), + ), + h.OnEvent(hx.KeyDownEvent, js.SubmitFormOnEnter()), + ) +} + +func Form(ctx *h.RequestContext) *h.Element { + return h.Div( + h.Class("flex flex-col items-center justify-center p-4 gap-6"), + h.H2F("Form submission with ws example", h.Class("text-2xl font-bold")), + h.Form( + h.Attribute("ws-send", ""), + h.Class("flex flex-col gap-2"), + h.LabelFor("name", "Your Message"), + MessageInput(), + SubmitButton(), + ), + ) +} + +func SubmitButton() *h.Element { + buttonClasses := "rounded items-center px-3 py-2 bg-slate-800 text-white w-full text-center" + return h.Div( + h.HxBeforeRequest( + js.RemoveClassOnChildren(".loading", "hidden"), + js.SetClassOnChildren(".submit", "hidden"), + ), + h.HxAfterRequest( + js.SetClassOnChildren(".loading", "hidden"), + js.RemoveClassOnChildren(".submit", "hidden"), + ), + h.Class("flex gap-2 justify-center"), + h.Button( + h.Class("loading hidden relative text-center", buttonClasses), + Spinner(), + h.Disabled(), + h.Text("Submitting..."), + ), + h.Button( + h.Type("submit"), + h.Class("submit", buttonClasses), + h.Text("Submit"), + ), + ) +} + +func Spinner(children ...h.Ren) *h.Element { + return h.Div( + h.Children(children...), + h.Class("absolute left-1 spinner spinner-border animate-spin inline-block w-6 h-6 border-4 rounded-full border-slate-200 border-t-transparent"), + h.Attribute("role", "status"), + ) +} diff --git a/examples/chat/pages/root.go b/examples/chat/pages/root.go new file mode 100644 index 0000000..806a882 --- /dev/null +++ b/examples/chat/pages/root.go @@ -0,0 +1,22 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func RootPage(children ...h.Ren) h.Ren { + extensions := h.BaseExtensions() + return h.Html( + h.HxExtension(extensions), + h.Head( + h.Link("/public/main.css", "stylesheet"), + h.Script("/public/htmgo.js"), + ), + h.Body( + h.Div( + h.Class("flex flex-col gap-2 bg-white h-full"), + h.Fragment(children...), + ), + ), + ) +} diff --git a/examples/chat/partials/index.go b/examples/chat/partials/index.go new file mode 100644 index 0000000..f5b47e8 --- /dev/null +++ b/examples/chat/partials/index.go @@ -0,0 +1,54 @@ +package partials + +import ( + "github.com/maddalax/htmgo/framework/h" + "strconv" +) + +func CounterPartial(ctx *h.RequestContext) *h.Partial { + count, err := strconv.ParseInt(ctx.FormValue("count"), 10, 64) + + if err != nil { + count = 0 + } + + count++ + + return h.SwapManyPartial( + ctx, + CounterForm(int(count)), + h.ElementIf(count > 10, SubmitButton("New record!")), + ) +} + +func CounterForm(count int) *h.Element { + return h.Form( + h.Class("flex flex-col gap-3 items-center"), + h.Id("counter-form"), + h.PostPartial(CounterPartial), + h.Input("text", + h.Class("hidden"), + h.Value(count), + h.Name("count"), + ), + h.P( + h.AttributePairs( + "id", "counter", + "class", "text-xl", + "name", "count", + "text", "count", + ), + h.TextF("Count: %d", count), + ), + SubmitButton("Increment"), + ) +} + +func SubmitButton(text string) *h.Element { + return h.Button( + h.Class("bg-rose-400 hover:bg-rose-500 text-white font-bold py-2 px-4 rounded"), + h.Id("swap-text"), + h.Type("submit"), + h.Text(text), + ) +} diff --git a/examples/chat/tailwind.config.js b/examples/chat/tailwind.config.js new file mode 100644 index 0000000..b18125c --- /dev/null +++ b/examples/chat/tailwind.config.js @@ -0,0 +1,5 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["**/*.go"], + plugins: [], +}; diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go new file mode 100644 index 0000000..cbe04be --- /dev/null +++ b/examples/chat/ws/handler.go @@ -0,0 +1,44 @@ +package ws + +import ( + "context" + "github.com/coder/websocket" + "github.com/coder/websocket/wsjson" + "github.com/google/uuid" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "net/http" +) + +func Handle() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + c, err := websocket.Accept(w, r, nil) + cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) + locator := cc.ServiceLocator() + manager := service.Get[SocketManager](locator) + + if err != nil { + return + } + + id := uuid.NewString() + manager.Add(id, c) + + defer func() { + manager.Disconnect(id) + }() + + for { + var v map[string]any + err = wsjson.Read(context.Background(), c, &v) + if err != nil { + manager.CloseWithError(id, "failed to read message") + return + } + if v != nil { + manager.OnMessage(id, v) + } + + } + } +} diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go new file mode 100644 index 0000000..ae52bd8 --- /dev/null +++ b/examples/chat/ws/manager.go @@ -0,0 +1,80 @@ +package ws + +import ( + "context" + "fmt" + "github.com/coder/websocket" + "github.com/puzpuzpuz/xsync/v3" +) + +type MessageEvent struct { + Id string + Message map[string]any +} + +type SocketManager struct { + sockets *xsync.MapOf[string, *websocket.Conn] + listeners []chan MessageEvent +} + +func NewSocketManager() *SocketManager { + return &SocketManager{ + sockets: xsync.NewMapOf[string, *websocket.Conn](), + } +} + +func (manager *SocketManager) Listen(listener chan MessageEvent) { + if manager.listeners == nil { + manager.listeners = make([]chan MessageEvent, 0) + } + manager.listeners = append(manager.listeners, listener) +} + +func (manager *SocketManager) OnMessage(id string, message map[string]any) { + for _, listener := range manager.listeners { + listener <- MessageEvent{ + Id: id, + Message: message, + } + } +} + +func (manager *SocketManager) Add(id string, conn *websocket.Conn) { + manager.sockets.Store(id, conn) +} + +func (manager *SocketManager) CloseWithError(id string, message string) { + conn := manager.Get(id) + if conn != nil { + conn.Close(websocket.StatusInternalError, message) + } +} + +func (manager *SocketManager) Disconnect(id string) { + conn := manager.Get(id) + if conn != nil { + _ = conn.CloseNow() + } + manager.sockets.Delete(id) +} + +func (manager *SocketManager) Get(id string) *websocket.Conn { + conn, _ := manager.sockets.Load(id) + return conn +} + +func (manager *SocketManager) Broadcast(message []byte, messageType websocket.MessageType) { + ctx := context.Background() + manager.sockets.Range(func(id string, conn *websocket.Conn) bool { + err := conn.Write(ctx, messageType, message) + if err != nil { + manager.Disconnect(id) + } + return true + }) +} + +func (manager *SocketManager) BroadcastText(message string) { + fmt.Printf("Broadcasting message: \n%s\n", message) + manager.Broadcast([]byte(message), websocket.MessageText) +} diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index 902894f..b47ba73 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var Q=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(h,E){s=h,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let h=getRawAttribute(b,"formaction");h!=null&&(t=h);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let h=p.split(":"),E=h[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(h[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let h=getInternalData(r);h&&h.triggerSpec&&h.triggerSpec.queue&&(x=h.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},P=getClosestAttributeValue(n,"hx-prompt");if(P){var I=prompt(P);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),L=v.errors,N=v.formData;o.values&&overrideFormData(N,formDataFromObject(o.values));let B=formDataFromObject(getExpressionVars(n)),_=overrideFormData(N,B),q=filterValues(_,n);htmx.config.getCacheBusterParam&&e==="get"&&q.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let W=getValuesForElement(n,"hx-request"),z=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:z,useUrlParams:F,formData:q,parameters:formDataProxy(q),unfilteredFormData:_,unfilteredParameters:formDataProxy(_),headers:R,target:c,verb:e,errors:L,withCredentials:o.credentials||W.credentials||htmx.config.withCredentials,timeout:o.timeout||W.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,q=formDataFromObject(w.parameters),L=w.errors,F=w.useUrlParams,L&&L.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let J=t.split("#"),Y=J[0],X=J[1],D=t;if(F&&(D=Y,!q.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(q),X&&(D+="#"+X))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!W.noHeaders){for(let h in R)if(R.hasOwnProperty(h)){let E=R[h];safelySetHeaderValue(m,h,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:z,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:X}};if(m.onload=function(){try{let h=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;h.length>0&&E==null;){let O=h.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(h){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:h},y)),h}},m.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(h){forEach([m,m.upload],function(E){E.addEventListener(h,function(O){triggerEvent(n,"htmx:xhr:"+h,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let $=F?null:encodeParamsForBody(m,n,q);return m.send($),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),g=Q;function K(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{if(!(t instanceof CustomEvent))return !1;let n=t.detail.target;return n&&n.children&&Array.from(n.children).forEach(r=>{g.trigger(r,e,null);}),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});g.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e):console&&console.log("DEBUG:",e);}});var C=g.config,k,ee="hx-target-";function G(e,t){return e.substring(0,t.length)===t}function te(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(G(n,"4")||G(n,"5"))&&r.push("error");for(let o=0;o{k=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,j(t),!0;if(!t.detail.requestConfig)return !0;let n=te(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(j(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});g.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&g.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{g.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";g.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(g.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ne());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ne(){window.location.reload();}var re=/__eval_[A-Za-z0-9]+\(\)/gm;g.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&oe(t.target);}});function oe(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(re)||[];for(let o of r){let i=o.replace("()",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&s.remove();}}}function ie(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}ie((e,t)=>{se(t);});function se(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))g.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),g.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){g.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&g.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var re=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let x=consumeCSSSelector(o);x.length>0&&(s+=" "+x);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),g=l.value;if(c.lastValue===g)return;c.lastValue=g;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(m,b){s=m,l=b;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let g=getInternalData(n),x=g.lastButtonClicked;if(x){let m=getRawAttribute(x,"formaction");m!=null&&(t=m);let b=getRawAttribute(x,"formmethod");b!=null&&b.toLowerCase()!=="dialog"&&(e=b);}let C=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:C})===!1)return maybeCall(s),a;let v=n,E=getClosestAttributeValue(n,"hx-sync"),p=null,T=!1;if(E){let m=E.split(":"),b=m[0].trim();if(b==="this"?v=findThisElement(n,"hx-sync"):v=asElement(querySelectorExt(n,b)),E=(m[1]||"drop").trim(),g=getInternalData(v),E==="drop"&&g.xhr&&g.abortable!==!0)return maybeCall(s),a;if(E==="abort"){if(g.xhr)return maybeCall(s),a;T=!0;}else E==="replace"?triggerEvent(v,"htmx:abort"):E.indexOf("queue")===0&&(p=(E.split(" ")[1]||"last").trim());}if(g.xhr)if(g.abortable)triggerEvent(v,"htmx:abort");else {if(p==null){if(r){let m=getInternalData(r);m&&m.triggerSpec&&m.triggerSpec.queue&&(p=m.triggerSpec.queue);}p==null&&(p="last");}return g.queuedRequests==null&&(g.queuedRequests=[]),p==="first"&&g.queuedRequests.length===0?g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):p==="all"?g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):p==="last"&&(g.queuedRequests=[],g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let y=new XMLHttpRequest;g.xhr=y,g.abortable=T;let R=function(){g.xhr=null,g.abortable=!1,g.queuedRequests!=null&&g.queuedRequests.length>0&&g.queuedRequests.shift()();},k=getClosestAttributeValue(n,"hx-prompt");if(k){var L=prompt(k);if(L===null||!triggerEvent(n,"htmx:prompt",{prompt:L,target:c}))return maybeCall(s),R(),a}if(C&&!i&&!confirm(C))return maybeCall(s),R(),a;let D=getHeaders(n,c,L);e!=="get"&&!usesFormData(n)&&(D["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(D=mergeObjects(D,o.headers));let S=getInputValues(n,e),q=S.errors,N=S.formData;o.values&&overrideFormData(N,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),j=overrideFormData(N,_),P=filterValues(j,n);htmx.config.getCacheBusterParam&&e==="get"&&P.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,A={boosted:G,useUrlParams:F,formData:P,parameters:formDataProxy(P),unfilteredFormData:j,unfilteredParameters:formDataProxy(j),headers:D,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",A))return maybeCall(s),R(),a;if(t=A.path,e=A.verb,D=A.headers,P=formDataFromObject(A.parameters),q=A.errors,F=A.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",A),maybeCall(s),R(),a;let Y=t.split("#"),te=Y[0],z=Y[1],I=t;if(F&&(I=te,!P.keys().next().done&&(I.indexOf("?")<0?I+="?":I+="&",I+=urlEncode(P),z&&(I+="#"+z))),!verifyPath(n,I,A))return triggerErrorEvent(n,"htmx:invalidPath",A),maybeCall(l),a;if(y.open(e.toUpperCase(),I,!0),y.overrideMimeType("text/html"),y.withCredentials=A.withCredentials,y.timeout=A.timeout,!X.noHeaders){for(let m in D)if(D.hasOwnProperty(m)){let b=D[m];safelySetHeaderValue(y,m,b);}}let w={xhr:y,target:c,requestConfig:A,etc:o,boosted:G,select:d,pathInfo:{requestPath:t,finalRequestPath:I,responsePath:null,anchor:z}};if(y.onload=function(){try{let m=hierarchyForElt(n);if(w.pathInfo.responsePath=getPathFromResponse(y),u(n,w),w.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",w),triggerEvent(n,"htmx:afterOnLoad",w),!bodyContains(n)){let b=null;for(;m.length>0&&b==null;){let O=m.shift();bodyContains(O)&&(b=O);}b&&(triggerEvent(b,"htmx:afterRequest",w),triggerEvent(b,"htmx:afterOnLoad",w));}maybeCall(s),R();}catch(m){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:m},w)),m}},y.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:sendError",w),maybeCall(l),R();},y.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:sendAbort",w),maybeCall(l),R();},y.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:timeout",w),maybeCall(l),R();},!triggerEvent(n,"htmx:beforeRequest",w))return maybeCall(s),R(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(m){forEach([y,y.upload],function(b){b.addEventListener(m,function(O){triggerEvent(n,"htmx:xhr:"+m,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",w);let ne=F?null:encodeParamsForBody(y,n,P);return y.send(ne),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(L,p.swapDelay):L();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=re;function oe(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=se(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=ae(s.replace("hx-on::","htmx:"),n.detail);o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){e=="htmx:wsBeforeMessage"&&(console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t));}});var H=h.config,W,le="hx-target-";function K(e,t){return e.substring(0,t.length)===t}function ue(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(K(n,"4")||K(n,"5"))&&r.push("error");for(let o=0;o{W=e,H.responseTargetUnsetsError===void 0&&(H.responseTargetUnsetsError=!0),H.responseTargetSetsError===void 0&&(H.responseTargetSetsError=!1),H.responseTargetPrefersExisting===void 0&&(H.responseTargetPrefersExisting=!1),H.responseTargetPrefersRetargetHeader===void 0&&(H.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(H.responseTargetPrefersExisting||H.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,Q(t),!0;if(!t.detail.requestConfig)return !0;let n=ue(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(Q(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ce());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ce(){window.location.reload();}var fe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(fe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var f;function de(e){return e.trim().split(/\s+/)}function ge(e){let t=f.getAttributeValue(e,"hx-ws");if(t){let n=de(t);for(let r=0;rh.createWebSocket(t));n.addEventListener("message",r=>{if(U(e))return;let o=r.data;if(!f.triggerEvent(e,"htmx:wsBeforeMessage",{message:o,socketWrapper:n.publicInterface}))return;f.withExtensions(e,l=>{o=l.transformResponse(o,null,e);});let i=f.makeSettleInfo(e),s=f.makeFragment(o);if(s.children.length){let l=Array.from(s.children);for(let a=0;a0;){let r=this.messageQueue[0];if(this.socket.readyState===this.socket.OPEN)this.sendImmediately(r.message,r.sendElt),this.messageQueue.shift();else break}},init(){this.socket&&this.socket.readyState===this.socket.OPEN&&this.socket.close();let r=t();f.triggerEvent(e,"htmx:wsConnecting",{event:{type:"connecting"}}),this.socket=r,r.onopen=i=>{this.retryCount=0,f.triggerEvent(e,"htmx:wsOpen",{event:i,socketWrapper:this.publicInterface}),this.handleQueuedMessages();},r.onclose=i=>{if(!U(e)&&[1006,1012,1013].indexOf(i.code)>=0){let s=be(this.retryCount);setTimeout(()=>{this.retryCount+=1,this.init();},s);}f.triggerEvent(e,"htmx:wsClose",{event:i,socketWrapper:this.publicInterface});},r.onerror=i=>{f.triggerErrorEvent(e,"htmx:wsError",{error:i,socketWrapper:this}),U(e);};let o=this.events;Object.keys(o).forEach(i=>{o[i].forEach(s=>{r.addEventListener(i,s);});});},close(){this.socket.close();},publicInterface:{}};return n.init(),n.publicInterface={send:n.send.bind(n),sendImmediately:n.sendImmediately.bind(n),queue:n.messageQueue},n}function Ee(e){let t=f.getAttributeValue(e,"hx-ws");if(t&&t!=="send")return;let n=f.getClosestMatch(e,pe);n&&ye(n,e);}function pe(e){return f.getInternalData(e).webSocket!=null}function ye(e,t){let n=f.getInternalData(t);f.getTriggerSpecs(t).forEach(o=>{f.addTriggerHandler(t,o,n,(i,s)=>{if(U(e))return;let l=f.getInternalData(e).webSocket,a=f.getHeaders(t,f.getTarget(t)),u=f.getInputValues(t,"post"),d=u.errors,c=Object.assign({},u.values),g=f.getExpressionVars(t),x=f.mergeObjects(c,g),v={parameters:f.filterValues(x,t),unfilteredParameters:x,headers:a,errors:d,triggeringEvent:s,messageBody:void 0,socketWrapper:l.publicInterface};if(!f.triggerEvent(i,"htmx:wsConfigSend",v))return;if(d&&d.length>0){f.triggerEvent(i,"htmx:validation:halted",d);return}let E=v.messageBody;if(E===void 0){let p=Object.assign({},v.parameters);v.headers&&(p.HEADERS=a),E=JSON.stringify(p);}l.send(E,i),s&&f.shouldCancel(s,i)&&s.preventDefault();});});}function be(e){let t=h.config.wsReconnectDelay;if(typeof t=="function")return t(e);if(t==="full-jitter"){let n=Math.min(e,6);return 1e3*Math.pow(2,n)*Math.random()}return 0}function U(e){return f.bodyContains(e)?!1:(f.getInternalData(e).webSocket.close(),!0)}function xe(e){let t=new WebSocket(e,[]);return t.binaryType=h.config.wsBinaryType||"blob",t}function Z(e,t){let n=[];return (f.hasAttribute(e,t)||f.hasAttribute(e,"hx-ws"))&&n.push(e),e.querySelectorAll("["+t+"], [data-"+t+"], [data-hx-ws], [hx-ws]").forEach(r=>{n.push(r);}),n}function ee(e,t){e&&e.forEach(t);}h.defineExtension("ws",{init:e=>{f=e,h.createWebSocket||(h.createWebSocket=xe),h.config.wsReconnectDelay||(h.config.wsReconnectDelay="full-jitter");},onEvent:(e,t)=>{let n=t.target||t.detail.elt;if(n instanceof HTMLElement)switch(e){case"htmx:beforeCleanupElement":J(n);let r=f.getInternalData(n);r.webSocket&&r.webSocket.close();return;case"htmx:beforeProcessNode":ee(Z(n,"ws-connect"),o=>{he(o);}),ee(Z(n,"ws-send"),o=>{Ee(o);});}}});function ve(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}ve((e,t)=>{we(t);});function we(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwiYXR0clByZWZpeCIsInN0YXJ0c1dpdGgiLCJnZXRSZXNwQ29kZVRhcmdldCIsInJlc3BDb2RlTnVtYmVyIiwicmVzcENvZGUiLCJhdHRyUG9zc2liaWxpdGllcyIsImF0dHJWYWx1ZSIsImhhbmRsZUVycm9yRmxhZyIsImFwaVJlZiIsImxhc3RWZXJzaW9uIiwiZW5hYmxlZCIsImV2ZW50U291cmNlIiwibWVzc2FnZSIsInJlbG9hZCIsImV2YWxGdW5jUmVnZXgiLCJyZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyIsIm1hdGNoZXMiLCJlbGUiLCJ3YXRjaFVybCIsImxhc3RVcmwiLCJfIiwibmV3VXJsIiwib25VcmxDaGFuZ2UiLCJoYXNNYXRjaCIsImRlZmF1bHRLZXkiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLEVBQVEsVUFBVyxDQUlyQixJQUFNLElBQUEsQ0FBTyxDQUlYLE1BQVEsQ0FBQSxJQUFBLENBRVIsUUFBUyxJQUVULENBQUEsRUFBQSxDQUFJLEtBRUosR0FBSyxDQUFBLElBQUEsQ0FFTCxRQUFTLElBRVQsQ0FBQSxJQUFBLENBQU0sS0FHTixJQUFNLENBQUEsSUFBQSxDQUVOLFFBQVMsSUFFVCxDQUFBLE9BQUEsQ0FBUyxLQVVULE1BQVEsQ0FBQSxTQUFTQyxFQUFLQyxDQUFNLENBQUEsQ0FFMUIsT0FEb0IsY0FBZUQsQ0FBQUEsQ0FBQUEsQ0FBS0MsR0FBUSxNQUFNLENBQUEsQ0FDbkMsTUFDckIsQ0FHQSxDQUFBLE1BQUEsQ0FBUSxLQUVSLFFBQVUsQ0FBQSxJQUFBLENBRVYsWUFBYSxJQUViLENBQUEsV0FBQSxDQUFhLElBRWIsQ0FBQSxTQUFBLENBQVcsS0FFWCxJQUFNLENBQUEsSUFBQSxDQUdOLGdCQUFpQixJQUVqQixDQUFBLGVBQUEs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QUFBLENBQUssS0FBSzVTLENBQUlBLENBQUFBLENBQUFBLENBQUcsYUFBYWhDLENBQUksQ0FBQSxFQUFLLEdBQUksQ0FDekMsU0FBQSxDQUFXLFlBQ1gsU0FBVyxDQUFBLENBQUEsQ0FDWCxZQUFhLENBQ2YsQ0FBQyxFQUNENlcsQ0FBVyxDQUFBLENBQUEsQ0FBQSxDQUNYLEtBQ0YsQ0FDRixDQUVGLEdBQUksQ0FBQ0EsQ0FBQUEsQ0FBVSxDQUNiLElBQUlDLENBQUFBLENBQWE5VSxFQUFHLFlBQWEsQ0FBQSxxQkFBcUIsRUFDbEQ4VSxDQUNGbEMsRUFBQUEsQ0FBQUEsQ0FBSyxLQUNINVMsQ0FDQUEsQ0FBQUEsQ0FBQUEsQ0FBRyxhQUFhLHNCQUF5QjhVLENBQUFBLENBQVUsR0FBSyxFQUN4RCxDQUFBLENBQUUsVUFBVyxXQUFhLENBQUEsU0FBQSxDQUFXLEVBQUcsV0FBYSxDQUFBLENBQUUsQ0FDekQsRUFFSixDQUNGLENBQUMsRUFDSCIsImZpbGUiOiJodG1nby5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBodG14ID0gKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCdcblxuICAvLyBQdWJsaWMgQVBJXG4gIGNvbnN0IGh0bXggPSB7XG4gICAgLy8gVHNjIG1hZG5lc3MgaGVyZSwgYXNzaWduaW5nIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgcmVzdWx0cyBpbiBhbiBpbnZhbGlkIFR5cGVTY3JpcHQgb3V0cHV0LCBidXQgcmVhc3NpZ25pbmcgaXMgZmluZVxuICAgIC8qIEV2ZW50IHByb2Nlc3NpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBvbkxvYWRIZWxwZXJ9ICovXG4gICAgb25Mb2FkOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHByb2Nlc3NOb2RlfSAqL1xuICAgIHByb2Nlc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb2ZmOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRyaWdnZXJFdmVudH0gKi9cbiAgICB0cmlnZ2VyOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFqYXhIZWxwZXJ9ICovXG4gICAgYWpheDogbnVsbCxcbiAgICAvKiBET00gcXVlcnlpbmcgaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmR9ICovXG4gICAgZmluZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kQWxsfSAqL1xuICAgIGZpbmRBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgY2xvc2VzdH0gKi9cbiAgICBjbG9zZXN0OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlucHV0IHZhbHVlcyB0aGF0IHdvdWxkIHJlc29sdmUgZm9yIGEgZ2l2ZW4gZWxlbWVudCB2aWEgdGhlIGh0bXggdmFsdWUgcmVzb2x1dGlvbiBtZWNoYW5pc21cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3ZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbHQgdGhlIGVsZW1lbnQgdG8gcmVzb2x2ZSB2YWx1ZXMgb25cbiAgICAgKiBAcGFyYW0ge0h0dHBWZXJifSB0eXBlIHRoZSByZXF1ZXN0IHR5cGUgKGUuZy4gKipnZXQqKiBvciAqKnBvc3QqKikgbm9uLUdFVCdzIHdpbGwgaW5jbHVkZSB0aGUgZW5jbG9zaW5nIGZvcm0gb2YgdGhlIGVsZW1lbnQuIERlZmF1bHRzIHRvICoqcG9zdCoqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKGVsdCwgdHlwZSkge1xuICAgICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHR5cGUgfHwgJ3Bvc3QnKVxuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzLnZhbHVlc1xuICAgIH0sXG4gICAgLyogRE9NIG1hbmlwdWxhdGlvbiBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRWxlbWVudH0gKi9cbiAgICByZW1vdmU6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkQ2xhc3NUb0VsZW1lbnR9ICovXG4gICAgYWRkQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudH0gKi9cbiAgICByZW1vdmVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0b2dnbGVDbGFzc09uRWxlbWVudH0gKi9cbiAgICB0b2dnbGVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0YWtlQ2xhc3NGb3JFbGVtZW50fSAqL1xuICAgIHRha2VDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBzd2FwfSAqL1xuICAgIHN3YXA6IG51bGwsXG4gICAgLyogRXh0ZW5zaW9uIGVudHJ5cG9pbnRzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZGVmaW5lRXh0ZW5zaW9ufSAqL1xuICAgIGRlZmluZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFeHRlbnNpb259ICovXG4gICAgcmVtb3ZlRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ0FsbH0gKi9cbiAgICBsb2dBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nTm9uZX0gKi9cbiAgICBsb2dOb25lOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBsb2dnZXIgaHRteCB1c2VzIHRvIGxvZyB3aXRoXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dnZXJcbiAgICAgKi9cbiAgICBsb2dnZXI6IG51bGwsXG4gICAgLyoqXG4gICAgICogQSBwcm9wZXJ0eSBob2xkaW5nIHRoZSBjb25maWd1cmF0aW9uIGh0bXggdXNlcyBhdCBydW50aW1lLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVzaW5nIGEgW21ldGEgdGFnXShodHRwczovL2h0bXgub3JnL2RvY3MvI2NvbmZpZykgaXMgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2NvbmZpZ1xuICAgICAqL1xuICAgIGNvbmZpZzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBoaXN0b3J5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBoaXN0b3J5RW5hYmxlZDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG51bWJlciBvZiBwYWdlcyB0byBrZWVwIGluICoqbG9jYWxTdG9yYWdlKiogZm9yIGhpc3Rvcnkgc3VwcG9ydC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUNhY2hlU2l6ZTogMTAsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHJlZnJlc2hPbkhpc3RvcnlNaXNzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgc3dhcCBzdHlsZSB0byB1c2UgaWYgKipbaHgtc3dhcF0oaHR0cHM6Ly9odG14Lm9yZy9hdHRyaWJ1dGVzL2h4LXN3YXApKiogaXMgb21pdHRlZC5cbiAgICAgICAqIEB0eXBlIEh0bXhTd2FwU3R5bGVcbiAgICAgICAqIEBkZWZhdWx0ICdpbm5lckhUTUwnXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwU3R5bGU6ICdpbm5lckhUTUwnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhbmQgZG9pbmcgdGhlIHN3YXAuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBEZWxheTogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiBjb21wbGV0aW5nIHRoZSBjb250ZW50IHN3YXAgYW5kIHNldHRsaW5nIGF0dHJpYnV0ZXMuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTZXR0bGVEZWxheTogMjAsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRydWUsIGh0bXggd2lsbCBpbmplY3QgYSBzbWFsbCBhbW91bnQgb2YgQ1NTIGludG8gdGhlIHBhZ2UgdG8gbWFrZSBpbmRpY2F0b3JzIGludmlzaWJsZSB1bmxlc3MgdGhlICoqaHRteC1pbmRpY2F0b3IqKiBjbGFzcyBpcyBwcmVzZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBpbmNsdWRlSW5kaWNhdG9yU3R5bGVzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gaW5kaWNhdG9ycyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWluZGljYXRvcidcbiAgICAgICAqL1xuICAgICAgaW5kaWNhdG9yQ2xhc3M6ICdodG14LWluZGljYXRvcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0cmlnZ2VyaW5nIGVsZW1lbnRzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtcmVxdWVzdCdcbiAgICAgICAqL1xuICAgICAgcmVxdWVzdENsYXNzOiAnaHRteC1yZXF1ZXN0JyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHRlbXBvcmFyaWx5IHBsYWNlIG9uIGVsZW1lbnRzIHRoYXQgaHRteCBoYXMgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtYWRkZWQnXG4gICAgICAgKi9cbiAgICAgIGFkZGVkQ2xhc3M6ICdodG14LWFkZGVkJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zZXR0bGluZydcbiAgICAgICAqL1xuICAgICAgc2V0dGxpbmdDbGFzczogJ2h0bXgtc2V0dGxpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc3dhcHBpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXN3YXBwaW5nJ1xuICAgICAgICovXG4gICAgICBzd2FwcGluZ0NsYXNzOiAnaHRteC1zd2FwcGluZycsXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93cyB0aGUgdXNlIG9mIGV2YWwtbGlrZSBmdW5jdGlvbmFsaXR5IGluIGh0bXgsIHRvIGVuYWJsZSAqKmh4LXZhcnMqKiwgdHJpZ2dlciBjb25kaXRpb25zICYgc2NyaXB0IHRhZyBldmFsdWF0aW9uLiBDYW4gYmUgc2V0IHRvICoqZmFsc2UqKiBmb3IgQ1NQIGNvbXBhdGliaWxpdHkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93RXZhbDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIGZhbHNlLCBkaXNhYmxlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc2NyaXB0IHRhZ3MuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93U2NyaXB0VGFnczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc2NyaXB0cy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU2NyaXB0Tm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzdHlsZXMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVN0eWxlTm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYXR0cmlidXRlcyB0byBzZXR0bGUgZHVyaW5nIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgKiBAZGVmYXVsdCBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddXG4gICAgICAgKi9cbiAgICAgIGF0dHJpYnV0ZXNUb1NldHRsZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3cgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyB1c2luZyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMsIGF1dGhvcml6YXRpb24gaGVhZGVycyBvciBUTFMgY2xpZW50IGNlcnRpZmljYXRlcy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICB0aW1lb3V0OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAqKmdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KiogZm9yIHJlY29ubmVjdGluZyBhZnRlciB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zcyBieSB0aGUgZXZlbnQgY29kZSAqKkFibm9ybWFsIENsb3N1cmUqKiwgKipTZXJ2aWNlIFJlc3RhcnQqKiBvciAqKlRyeSBBZ2FpbiBMYXRlcioqLlxuICAgICAgICogQHR5cGUgeydmdWxsLWppdHRlcicgfCAoKHJldHJ5Q291bnQ6bnVtYmVyKSA9PiBudW1iZXIpfVxuICAgICAgICogQGRlZmF1bHQgXCJmdWxsLWppdHRlclwiXG4gICAgICAgKi9cbiAgICAgIHdzUmVjb25uZWN0RGVsYXk6ICdmdWxsLWppdHRlcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0eXBlIG9mIGJpbmFyeSBkYXRhIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgKiBAdHlwZSBCaW5hcnlUeXBlXG4gICAgICAgKiBAZGVmYXVsdCAnYmxvYidcbiAgICAgICAqL1xuICAgICAgd3NCaW5hcnlUeXBlOiAnYmxvYicsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVTZWxlY3RvcjogJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7J2F1dG8nIHwgJ2luc3RhbnQnIHwgJ3Ntb290aCd9XG4gICAgICAgKiBAZGVmYXVsdCAnaW5zdGFudCdcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsQmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdGhlIGZvY3VzZWQgZWxlbWVudCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdEZvY3VzU2Nyb2xsOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIGluY2x1ZGUgYSBjYWNoZS1idXN0aW5nIHBhcmFtZXRlciBpbiBHRVQgcmVxdWVzdHMgdG8gYXZvaWQgY2FjaGluZyBwYXJ0aWFsIHJlc3BvbnNlcyBieSB0aGUgYnJvd3NlclxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2V0Q2FjaGVCdXN0ZXJQYXJhbTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBodG14IHdpbGwgdXNlIHRoZSBWaWV3IFRyYW5zaXRpb24gQVBJIHdoZW4gc3dhcHBpbmcgaW4gbmV3IGNvbnRlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnbG9iYWxWaWV3VHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBodG14IHdpbGwgZm9ybWF0IHJlcXVlc3RzIHdpdGggdGhlc2UgbWV0aG9kcyBieSBlbmNvZGluZyB0aGVpciBwYXJhbWV0ZXJzIGluIHRoZSBVUkwsIG5vdCB0aGUgcmVxdWVzdCBib2R5XG4gICAgICAgKiBAdHlwZSB7KEh0dHBWZXJiKVtdfVxuICAgICAgICogQGRlZmF1bHQgWydnZXQnLCAnZGVsZXRlJ11cbiAgICAgICAqL1xuICAgICAgbWV0aG9kc1RoYXRVc2VVcmxQYXJhbXM6IFsnZ2V0JywgJ2RlbGV0ZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgaHRteC1iYXNlZCByZXF1ZXN0cyB0byBub24tb3JpZ2luIGhvc3RzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgc2VsZlJlcXVlc3RzT25seTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIG5vdCB1cGRhdGUgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCB3aGVuIGEgdGl0bGUgdGFnIGlzIGZvdW5kIGluIG5ldyBjb250ZW50XG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBpZ25vcmVUaXRsZTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdGhlIHRhcmdldCBvZiBhIGJvb3N0ZWQgZWxlbWVudCBpcyBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsSW50b1ZpZXdPbkJvb3N0OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2FjaGUgdG8gc3RvcmUgZXZhbHVhdGVkIHRyaWdnZXIgc3BlY2lmaWNhdGlvbnMgaW50by5cbiAgICAgICAqIFlvdSBtYXkgZGVmaW5lIGEgc2ltcGxlIG9iamVjdCB0byB1c2UgYSBuZXZlci1jbGVhcmluZyBjYWNoZSwgb3IgaW1wbGVtZW50IHlvdXIgb3duIHN5c3RlbSB1c2luZyBhIFtwcm94eSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5KVxuICAgICAgICogQHR5cGUge09iamVjdHxudWxsfVxuICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICovXG4gICAgICB0cmlnZ2VyU3BlY3NDYWNoZTogbnVsbCxcbiAgICAgIC8qKiBAdHlwZSBib29sZWFuICovXG4gICAgICBkaXNhYmxlSW5oZXJpdGFuY2U6IGZhbHNlLFxuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnW10gKi9cbiAgICAgIHJlc3BvbnNlSGFuZGxpbmc6IFtcbiAgICAgICAgeyBjb2RlOiAnMjA0Jywgc3dhcDogZmFsc2UgfSxcbiAgICAgICAgeyBjb2RlOiAnWzIzXS4uJywgc3dhcDogdHJ1ZSB9LFxuICAgICAgICB7IGNvZGU6ICdbNDVdLi4nLCBzd2FwOiBmYWxzZSwgZXJyb3I6IHRydWUgfVxuICAgICAgXSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBwcm9jZXNzIE9PQiBzd2FwcyBvbiBlbGVtZW50cyB0aGF0IGFyZSBuZXN0ZWQgd2l0aGluIHRoZSBtYWluIHJlc3BvbnNlIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93TmVzdGVkT29iU3dhcHM6IHRydWVcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHBhcnNlSW50ZXJ2YWx9ICovXG4gICAgcGFyc2VJbnRlcnZhbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBpbnRlcm5hbEV2YWx9ICovXG4gICAgXzogbnVsbCxcbiAgICB2ZXJzaW9uOiAnMi4wLjInXG4gIH1cbiAgLy8gVHNjIG1hZG5lc3MgcGFydCAyXG4gIGh0bXgub25Mb2FkID0gb25Mb2FkSGVscGVyXG4gIGh0bXgucHJvY2VzcyA9IHByb2Nlc3NOb2RlXG4gIGh0bXgub24gPSBhZGRFdmVudExpc3RlbmVySW1wbFxuICBodG14Lm9mZiA9IHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgudHJpZ2dlciA9IHRyaWdnZXJFdmVudFxuICBodG14LmFqYXggPSBhamF4SGVscGVyXG4gIGh0bXguZmluZCA9IGZpbmRcbiAgaHRteC5maW5kQWxsID0gZmluZEFsbFxuICBodG14LmNsb3Nlc3QgPSBjbG9zZXN0XG4gIGh0bXgucmVtb3ZlID0gcmVtb3ZlRWxlbWVudFxuICBodG14LmFkZENsYXNzID0gYWRkQ2xhc3NUb0VsZW1lbnRcbiAgaHRteC5yZW1vdmVDbGFzcyA9IHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRcbiAgaHRteC50b2dnbGVDbGFzcyA9IHRvZ2dsZUNsYXNzT25FbGVtZW50XG4gIGh0bXgudGFrZUNsYXNzID0gdGFrZUNsYXNzRm9yRWxlbWVudFxuICBodG14LnN3YXAgPSBzd2FwXG4gIGh0bXguZGVmaW5lRXh0ZW5zaW9uID0gZGVmaW5lRXh0ZW5zaW9uXG4gIGh0bXgucmVtb3ZlRXh0ZW5zaW9uID0gcmVtb3ZlRXh0ZW5zaW9uXG4gIGh0bXgubG9nQWxsID0gbG9nQWxsXG4gIGh0bXgubG9nTm9uZSA9IGxvZ05vbmVcbiAgaHRteC5wYXJzZUludGVydmFsID0gcGFyc2VJbnRlcnZhbFxuICBodG14Ll8gPSBpbnRlcm5hbEV2YWxcblxuICBjb25zdCBpbnRlcm5hbEFQSSA9IHtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcixcbiAgICBib2R5Q29udGFpbnMsXG4gICAgY2FuQWNjZXNzTG9jYWxTdG9yYWdlLFxuICAgIGZpbmRUaGlzRWxlbWVudCxcbiAgICBmaWx0ZXJWYWx1ZXMsXG4gICAgc3dhcCxcbiAgICBoYXNBdHRyaWJ1dGUsXG4gICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RNYXRjaCxcbiAgICBnZXRFeHByZXNzaW9uVmFycyxcbiAgICBnZXRIZWFkZXJzLFxuICAgIGdldElucHV0VmFsdWVzLFxuICAgIGdldEludGVybmFsRGF0YSxcbiAgICBnZXRTd2FwU3BlY2lmaWNhdGlvbixcbiAgICBnZXRUcmlnZ2VyU3BlY3MsXG4gICAgZ2V0VGFyZ2V0LFxuICAgIG1ha2VGcmFnbWVudCxcbiAgICBtZXJnZU9iamVjdHMsXG4gICAgbWFrZVNldHRsZUluZm8sXG4gICAgb29iU3dhcCxcbiAgICBxdWVyeVNlbGVjdG9yRXh0LFxuICAgIHNldHRsZUltbWVkaWF0ZWx5LFxuICAgIHNob3VsZENhbmNlbCxcbiAgICB0cmlnZ2VyRXZlbnQsXG4gICAgdHJpZ2dlckVycm9yRXZlbnQsXG4gICAgd2l0aEV4dGVuc2lvbnNcbiAgfVxuXG4gIGNvbnN0IFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJ11cbiAgY29uc3QgVkVSQl9TRUxFQ1RPUiA9IFZFUkJTLm1hcChmdW5jdGlvbih2ZXJiKSB7XG4gICAgcmV0dXJuICdbaHgtJyArIHZlcmIgKyAnXSwgW2RhdGEtaHgtJyArIHZlcmIgKyAnXSdcbiAgfSkuam9pbignLCAnKVxuXG4gIGNvbnN0IEhFQURfVEFHX1JFR0VYID0gbWFrZVRhZ1JlZ0V4KCdoZWFkJylcblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVdGlsaXRpZXNcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZVRhZ1JlZ0V4KHRhZywgZ2xvYmFsID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPnw+KShbXFxcXHNcXFxcU10qPyk8XFxcXC8ke3RhZ30+YCxcbiAgICAgIGdsb2JhbCA/ICdnaW0nIDogJ2ltJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gaW50ZXJ2YWwgc3RyaW5nIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGh0bXggZG9lcy4gVXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgaGF2ZSB0aW1pbmctcmVsYXRlZCBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBDYXV0aW9uOiBBY2NlcHRzIGFuIGludCBmb2xsb3dlZCBieSBlaXRoZXIgKipzKiogb3IgKiptcyoqLiBBbGwgb3RoZXIgdmFsdWVzIHVzZSAqKnBhcnNlRmxvYXQqKlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwYXJzZUludGVydmFsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGltaW5nIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoc3RyKSB7XG4gICAgaWYgKHN0ciA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBsZXQgaW50ZXJ2YWwgPSBOYU5cbiAgICBpZiAoc3RyLnNsaWNlKC0yKSA9PSAnbXMnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0yKSlcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ3MnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdtJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMCAqIDYwXG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc05hTihpbnRlcnZhbCkgPyB1bmRlZmluZWQgOiBpbnRlcnZhbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBuYW1lKSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZWx0LmdldEF0dHJpYnV0ZShuYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgLy8gcmVzb2x2ZSB3aXRoIGJvdGggaHggYW5kIGRhdGEtaHggcHJlZml4ZXNcbiAgZnVuY3Rpb24gaGFzQXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiAhIWVsdC5oYXNBdHRyaWJ1dGUgJiYgKGVsdC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHxcbiAgICAgIGVsdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0UmF3QXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkgfHwgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyZW50RWx0KGVsdCkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgaWYgKCFwYXJlbnQgJiYgZWx0LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSByZXR1cm4gZWx0LnBhcmVudE5vZGVcbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge05vZGV8RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb290Tm9kZShlbHQsIGdsb2JhbCkge1xuICAgIHJldHVybiBlbHQuZ2V0Um9vdE5vZGUgPyBlbHQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogZ2xvYmFsIH0pIDogZ2V0RG9jdW1lbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7KGU6Tm9kZSkgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RNYXRjaChlbHQsIGNvbmRpdGlvbikge1xuICAgIHdoaWxlIChlbHQgJiYgIWNvbmRpdGlvbihlbHQpKSB7XG4gICAgICBlbHQgPSBwYXJlbnRFbHQoZWx0KVxuICAgIH1cblxuICAgIHJldHVybiBlbHQgfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gaW5pdGlhbEVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBhbmNlc3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShpbml0aWFsRWxlbWVudCwgYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGRpc2luaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWRpc2luaGVyaXQnKVxuICAgIHZhciBpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1pbmhlcml0JylcbiAgICBpZiAoaW5pdGlhbEVsZW1lbnQgIT09IGFuY2VzdG9yKSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuZGlzYWJsZUluaGVyaXRhbmNlKSB7XG4gICAgICAgIGlmIChpbmhlcml0ICYmIChpbmhlcml0ID09PSAnKicgfHwgaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlzaW5oZXJpdCAmJiAoZGlzaW5oZXJpdCA9PT0gJyonIHx8IGRpc2luaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgIHJldHVybiAndW5zZXQnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGxldCBjbG9zZXN0QXR0ciA9IG51bGxcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gISEoY2xvc2VzdEF0dHIgPSBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShlbHQsIGFzRWxlbWVudChlKSwgYXR0cmlidXRlTmFtZSkpXG4gICAgfSlcbiAgICBpZiAoY2xvc2VzdEF0dHIgIT09ICd1bnNldCcpIHtcbiAgICAgIHJldHVybiBjbG9zZXN0QXR0clxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBub24tc3RhbmRhcmQgcHJvcGVydGllcyBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFZhcmlhYmxlXG4gICAgY29uc3QgbWF0Y2hlc0Z1bmN0aW9uID0gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAoZWx0Lm1hdGNoZXMgfHwgZWx0Lm1hdGNoZXNTZWxlY3RvciB8fCBlbHQubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5vTWF0Y2hlc1NlbGVjdG9yKVxuICAgIHJldHVybiAhIW1hdGNoZXNGdW5jdGlvbiAmJiBtYXRjaGVzRnVuY3Rpb24uY2FsbChlbHQsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXJ0VGFnKHN0cikge1xuICAgIGNvbnN0IHRhZ01hdGNoZXIgPSAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2lcbiAgICBjb25zdCBtYXRjaCA9IHRhZ01hdGNoZXIuZXhlYyhzdHIpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VIVE1MKHJlc3ApIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKClcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwLCAndGV4dC9odG1sJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGVsdCkge1xuICAgIHdoaWxlIChlbHQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoZWx0LmNoaWxkTm9kZXNbMF0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7SFRNTFNjcmlwdEVsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KSB7XG4gICAgY29uc3QgbmV3U2NyaXB0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICAgIGZvckVhY2goc2NyaXB0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIG5ld1NjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgIH0pXG4gICAgbmV3U2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0LnRleHRDb250ZW50XG4gICAgbmV3U2NyaXB0LmFzeW5jID0gZmFsc2VcbiAgICBpZiAoaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2UpIHtcbiAgICAgIG5ld1NjcmlwdC5ub25jZSA9IGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlXG4gICAgfVxuICAgIHJldHVybiBuZXdTY3JpcHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkge1xuICAgIHJldHVybiBzY3JpcHQubWF0Y2hlcygnc2NyaXB0JykgJiYgKHNjcmlwdC50eXBlID09PSAndGV4dC9qYXZhc2NyaXB0JyB8fCBzY3JpcHQudHlwZSA9PT0gJ21vZHVsZScgfHwgc2NyaXB0LnR5cGUgPT09ICcnKVxuICB9XG5cbiAgLyoqXG4gICAqIHdlIGhhdmUgdG8gbWFrZSBuZXcgY29waWVzIG9mIHNjcmlwdCB0YWdzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBiZWNhdXNlXG4gICAqIFNPTUUgYnJvd3NlcnMgKG5vdCBzYXlpbmcgd2hvLCBidXQgaXQgaW52b2x2ZXMgYW4gZWxlbWVudCBhbmQgYW4gYW5pbWFsKSBkb24ndFxuICAgKiBleGVjdXRlIHNjcmlwdHMgY3JlYXRlZCBpbiA8dGVtcGxhdGU+IHRhZ3Mgd2hlbiB0aGV5IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBET01cbiAgICogYW5kIGFsbCB0aGUgb3RoZXJzIGRvIGxtYW9cbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudCkge1xuICAgIEFycmF5LmZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goLyoqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdCAqLyAoc2NyaXB0KSA9PiB7XG4gICAgICBpZiAoaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjcmlwdC5wYXJlbnROb2RlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdTY3JpcHQsIHNjcmlwdClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2NyaXB0LnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtEb2N1bWVudEZyYWdtZW50ICYge3RpdGxlPzogc3RyaW5nfX0gRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZVxuICAgKiBAZGVzY3JpcHRpb24gIGEgZG9jdW1lbnQgZnJhZ21lbnQgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZSBIVE1MLCBpbmNsdWRpbmdcbiAgICogYSBgdGl0bGVgIHByb3BlcnR5IGZvciBhbnkgdGl0bGUgaW5mb3JtYXRpb24gZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwb25zZSBIVE1MXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUZyYWdtZW50KHJlc3BvbnNlKSB7XG4gICAgLy8gc3RyaXAgaGVhZCB0YWcgdG8gZGV0ZXJtaW5lIHNoYXBlIG9mIHJlc3BvbnNlIHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICBjb25zdCByZXNwb25zZVdpdGhOb0hlYWQgPSByZXNwb25zZS5yZXBsYWNlKEhFQURfVEFHX1JFR0VYLCAnJylcbiAgICBjb25zdCBzdGFydFRhZyA9IGdldFN0YXJ0VGFnKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqL1xuICAgIGxldCBmcmFnbWVudFxuICAgIGlmIChzdGFydFRhZyA9PT0gJ2h0bWwnKSB7XG4gICAgICAvLyBpZiBpdCBpcyBhIGZ1bGwgZG9jdW1lbnQsIHBhcnNlIGl0IGFuZCByZXR1cm4gdGhlIGJvZHlcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2UpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGFnID09PSAnYm9keScpIHtcbiAgICAgIC8vIHBhcnNlIGJvZHkgdy9vIHdyYXBwaW5nIGluIHRlbXBsYXRlXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSBub24tYm9keSBwYXJ0aWFsIEhUTUwgY29udGVudCwgc28gd3JhcCBpdCBpbiBhIHRlbXBsYXRlIHRvIG1heGltaXplIHBhcnNpbmcgZmxleGliaWxpdHlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTCgnPGJvZHk+PHRlbXBsYXRlIGNsYXNzPVwiaW50ZXJuYWwtaHRteC13cmFwcGVyXCI+JyArIHJlc3BvbnNlV2l0aE5vSGVhZCArICc8L3RlbXBsYXRlPjwvYm9keT4nKVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAoZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudClcbiAgICAgIC8vIGV4dHJhY3QgdGl0bGUgaW50byBmcmFnbWVudCBmb3IgbGF0ZXIgcHJvY2Vzc2luZ1xuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcblxuICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIHdlIHN1cHBvcnQgYSB0aXRsZSB0YWcgYXQgdGhlIHJvb3QgbGV2ZWwgb2Ygbm9uLWJvZHkgcmVzcG9uc2VzLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdFxuICAgICAgdmFyIHRpdGxlRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsZW1lbnQgJiYgdGl0bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IGZyYWdtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgICBmcmFnbWVudC50aXRsZSA9IHRpdGxlRWxlbWVudC5pbm5lclRleHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dTY3JpcHRUYWdzKSB7XG4gICAgICAgIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZW1vdmUgYWxsIHNjcmlwdCB0YWdzIGlmIHNjcmlwdHMgYXJlIGRpc2FibGVkXG4gICAgICAgIGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUNhbGwoZnVuYykge1xuICAgIGlmIChmdW5jKSB7XG4gICAgICBmdW5jKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIGlzVHlwZShvLCB0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgRnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdmdW5jdGlvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgT2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSYXdPYmplY3Qobykge1xuICAgIHJldHVybiBpc1R5cGUobywgJ09iamVjdCcpXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT25IYW5kbGVyXG4gICAqIEBwcm9wZXJ0eSB7KGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXApfHN0cmluZ30gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdGVuZXJJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhOb2RlSW50ZXJuYWxEYXRhXG4gICAqIEVsZW1lbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2luaXRIYXNoXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtib29zdGVkXVxuICAgKiBAcHJvcGVydHkge09uSGFuZGxlcltdfSBbb25IYW5kbGVyc11cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgKiBAcHJvcGVydHkge0xpc3RlbmVySW5mb1tdfSBbbGlzdGVuZXJJbmZvc11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbY2FuY2VsbGVkXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmlnZ2VyZWRPbmNlXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5ZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfG51bGx9IFt0aHJvdHRsZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXN0VmFsdWVdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvYWRlZF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcmJdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbGxpbmddXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudHxudWxsfSBbbGFzdEJ1dHRvbkNsaWNrZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmVxdWVzdENvdW50XVxuICAgKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSBbeGhyXVxuICAgKiBAcHJvcGVydHkgeygoKSA9PiB2b2lkKVtdfSBbcXVldWVkUmVxdWVzdHNdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Fib3J0YWJsZV1cbiAgICpcbiAgICogRXZlbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gW3RyaWdnZXJTcGVjXVxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0W119IFtoYW5kbGVkRm9yXVxuICAgKi9cblxuICAvKipcbiAgICogZ2V0SW50ZXJuYWxEYXRhIHJldHJpZXZlcyBcInByaXZhdGVcIiBkYXRhIHN0b3JlZCBieSBodG14IHdpdGhpbiBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RXZlbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJbnRlcm5hbERhdGEoZWx0KSB7XG4gICAgY29uc3QgZGF0YVByb3AgPSAnaHRteC1pbnRlcm5hbC1kYXRhJ1xuICAgIGxldCBkYXRhID0gZWx0W2RhdGFQcm9wXVxuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IGVsdFtkYXRhUHJvcF0gPSB7fVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIHRvQXJyYXkgY29udmVydHMgYW4gQXJyYXlMaWtlIG9iamVjdCBpbnRvIGEgcmVhbCBhcnJheS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcmV0dXJucyB7VFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheShhcnIpIHtcbiAgICBjb25zdCByZXR1cm5BcnIgPSBbXVxuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJldHVybkFyci5wdXNoKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVybkFyclxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VFtdfE5hbWVkTm9kZU1hcHxIVE1MQ29sbGVjdGlvbnxIVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbnxBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcGFyYW0geyhUKSA9PiB2b2lkfSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykge1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZ1bmMoYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNTY3JvbGxlZEludG9WaWV3KGVsKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgZWxlbVRvcCA9IHJlY3QudG9wXG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IHJlY3QuYm90dG9tXG4gICAgcmV0dXJuIGVsZW1Ub3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZWxlbUJvdHRvbSA+PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBib2R5Q29udGFpbnMoZWx0KSB7XG4gICAgLy8gSUUgRml4XG4gICAgY29uc3Qgcm9vdE5vZGUgPSBlbHQuZ2V0Um9vdE5vZGUgJiYgZWx0LmdldFJvb3ROb2RlKClcbiAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhyb290Tm9kZS5ob3N0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcikge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pXG4gIH1cblxuICAvKipcbiAgICogbWVyZ2VPYmplY3RzIHRha2VzIGFsbCB0aGUga2V5cyBmcm9tXG4gICAqIG9iajIgYW5kIGR1cGxpY2F0ZXMgdGhlbSBpbnRvIG9iajFcbiAgICogQHRlbXBsYXRlIFQxXG4gICAqIEB0ZW1wbGF0ZSBUMlxuICAgKiBAcGFyYW0ge1QxfSBvYmoxXG4gICAqIEBwYXJhbSB7VDJ9IG9iajJcbiAgICogQHJldHVybnMge1QxICYgVDJ9XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZU9iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iajIpIHtcbiAgICAgIGlmIChvYmoyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqU3RyaW5nXG4gICAqIEByZXR1cm5zIHthbnl8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSlNPTihqU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGpTdHJpbmcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGVycm9yKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSB7XG4gICAgY29uc3QgdGVzdCA9ICdodG14OmxvY2FsU3RvcmFnZVRlc3QnXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRlc3QsIHRlc3QpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgpXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2gsIHVubGVzcyBpbmRleCBwYWdlXG4gICAgICBpZiAoISgvXlxcLyQvLnRlc3QocGF0aCkpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyskLywgJycpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGJlIGtpbmQgdG8gSUUxMSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IFVSTCgpXG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwdWJsaWMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBpbnRlcm5hbEV2YWwoc3RyKSB7XG4gICAgcmV0dXJuIG1heWJlRXZhbChnZXREb2N1bWVudCgpLmJvZHksIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2YWwoc3RyKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbGxiYWNrIGZvciB0aGUgKipodG14OmxvYWQqKiBldmVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9jZXNzIG5ldyBjb250ZW50LCBmb3IgZXhhbXBsZSBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnQgd2l0aCBhIGphdmFzY3JpcHQgbGlicmFyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvbkxvYWRcbiAgICpcbiAgICogQHBhcmFtIHsoZWx0OiBOb2RlKSA9PiB2b2lkfSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gY2FsbCBvbiBuZXdseSBsb2FkZWQgY29udGVudFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIG9uTG9hZEhlbHBlcihjYWxsYmFjaykge1xuICAgIGNvbnN0IHZhbHVlID0gaHRteC5vbignaHRteDpsb2FkJywgLyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2dCAqLyBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNhbGxiYWNrKGV2dC5kZXRhaWwuZWx0KVxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTG9nIGFsbCBodG14IGV2ZW50cywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ0FsbFxuICAgKi9cbiAgZnVuY3Rpb24gbG9nQWxsKCkge1xuICAgIGh0bXgubG9nZ2VyID0gZnVuY3Rpb24oZWx0LCBldmVudCwgZGF0YSkge1xuICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGVsdCwgZGF0YSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb2dOb25lKCkge1xuICAgIGh0bXgubG9nZ2VyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciAgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50IGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmQoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kQWxsXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50cyBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50Pn1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbGwoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZEFsbChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaW5kb3dcbiAgICovXG4gIGZ1bmN0aW9uIGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gd2luZG93XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWx0LCBkZWxheSkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbHQpXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRFbHQoZWx0KS5yZW1vdmVDaGlsZChlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzSHRtbEVsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICogQHJldHVybiB7UGFyZW50Tm9kZXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNQYXJlbnROb2RlKGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhIGNsYXNzIHRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhZGRDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBjbGFzcyB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIGFkZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmVmb3JlIGNsYXNzIGlzIGFkZGVkXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6LCBkZWxheSkge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHQuY2xhc3NMaXN0ICYmIGVsdC5jbGFzc0xpc3QuYWRkKGNsYXp6KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBub2RlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBjbGFzcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBjbGFzcyBpcyByZW1vdmVkKVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChub2RlLCBjbGF6eiwgZGVsYXkpIHtcbiAgICBsZXQgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQobm9kZSkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXp6KVxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY2xhc3NlcyBsZWZ0LCByZW1vdmUgdGhlIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZ2l2ZW4gY2xhc3Mgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0b2dnbGVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdG9nZ2xlIHRoZSBjbGFzcyBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRvZ2dsZVxuICAgKi9cbiAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3NPbkVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGVsdC5jbGFzc0xpc3QudG9nZ2xlKGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHRoZSBnaXZlbiBjbGFzcyBmcm9tIGl0cyBzaWJsaW5ncywgc28gdGhhdCBhbW9uZyBpdHMgc2libGluZ3MsIG9ubHkgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBoYXZlIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdGFrZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgdGFrZSB0aGUgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0YWtlXG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2xhc3NGb3JFbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBmb3JFYWNoKGVsdC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhenopXG4gICAgfSlcbiAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoZWx0KSwgY2xhenopXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMgcGFyZW50YWdlLCBpbmNsdXNpdmUgb2YgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY2xvc2VzdFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gZmluZCB0aGUgc2VsZWN0b3IgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGZpbmRcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGNsb3Nlc3QoZWx0LCBzZWxlY3Rvcikge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKGVsdCAmJiBlbHQuY2xvc2VzdCkge1xuICAgICAgcmV0dXJuIGVsdC5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPIHJlbW92ZSB3aGVuIElFIGdvZXMgYXdheVxuICAgICAgZG8ge1xuICAgICAgICBpZiAoZWx0ID09IG51bGwgfHwgbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGVsdCA9IGVsdCAmJiBhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHByZWZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSA9PT0gc3VmZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRyaW1tZWRTZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKVxuICAgIGlmIChzdGFydHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJzwnKSAmJiBlbmRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICcvPicpKSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yLnN1YnN0cmluZygxLCB0cmltbWVkU2VsZWN0b3IubGVuZ3RoIC0gMilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8RWxlbWVudHxEb2N1bWVudHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3IsIGdsb2JhbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChzZWxlY3Rvci5pbmRleE9mKCdjbG9zZXN0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2Nsb3Nlc3QoYXNFbGVtZW50KGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig4KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZmluZCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtmaW5kKGFzUGFyZW50Tm9kZShlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnbmV4dCcpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkubmV4dEVsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignbmV4dCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuRm9yd2FyZFF1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdwcmV2aW91cycpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkucHJldmlvdXNFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ3ByZXZpb3VzICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5CYWNrd2FyZHNRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig5KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICd3aW5kb3cnKSB7XG4gICAgICByZXR1cm4gW3dpbmRvd11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnYm9keScpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnQuYm9keV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncm9vdCcpIHtcbiAgICAgIHJldHVybiBbZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdnbG9iYWwgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3Iuc2xpY2UoNyksIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b0FycmF5KGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChub3JtYWxpemVTZWxlY3RvcihzZWxlY3RvcikpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuRm9yd2FyZFF1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkJhY2t3YXJkc1F1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VsZWN0b3JcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChnZXREb2N1bWVudCgpLmJvZHksIGVsdE9yU2VsZWN0b3IpWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7RXZlbnRUYXJnZXR9IFRcbiAgICogQHBhcmFtIHtUfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge1R9IFtjb250ZXh0XVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxUfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KGVsdE9yU2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmluZChhc1BhcmVudE5vZGUoY29udGV4dCkgfHwgZG9jdW1lbnQsIGVsdE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwfHN0cmluZ30gQW55RXZlbnROYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudEFyZ3NcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gICAqIEBwcm9wZXJ0eSB7QW55RXZlbnROYW1lfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEFueUV2ZW50TmFtZX0gYXJnMVxuICAgKiBAcGFyYW0ge0FueUV2ZW50TmFtZXxFdmVudExpc3RlbmVyfSBhcmcyXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFdmVudEFyZ3N9XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihhcmcyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiBnZXREb2N1bWVudCgpLmJvZHksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcxKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGFyZzEpLFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMiksXG4gICAgICAgIGxpc3RlbmVyOiBhcmczXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvblxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIHwgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvciB8IHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIGNvbnN0IGIgPSBpc0Z1bmN0aW9uKGFyZzIpXG4gICAgcmV0dXJuIGIgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29mZlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICByZXR1cm4gaXNGdW5jdGlvbihhcmcyKSA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOb2RlIHByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjb25zdCBEVU1NWV9FTFQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ291dHB1dCcpIC8vIGR1bW15IGVsZW1lbnQgZm9yIGJhZCBzZWxlY3RvcnNcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCBhdHRyTmFtZSkge1xuICAgIGNvbnN0IGF0dHJUYXJnZXQgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyTmFtZSlcbiAgICBpZiAoYXR0clRhcmdldCkge1xuICAgICAgaWYgKGF0dHJUYXJnZXQgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gW2ZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJOYW1lKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBhdHRyVGFyZ2V0KVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxvZ0Vycm9yKCdUaGUgc2VsZWN0b3IgXCInICsgYXR0clRhcmdldCArICdcIiBvbiAnICsgYXR0ck5hbWUgKyAnIHJldHVybmVkIG5vIG1hdGNoZXMhJylcbiAgICAgICAgICByZXR1cm4gW0RVTU1ZX0VMVF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGFzRWxlbWVudChnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShhc0VsZW1lbnQoZWx0KSwgYXR0cmlidXRlKSAhPSBudWxsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUYXJnZXQoZWx0KSB7XG4gICAgY29uc3QgdGFyZ2V0U3RyID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgaWYgKHRhcmdldFN0cikge1xuICAgICAgaWYgKHRhcmdldFN0ciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdGFyZ2V0U3RyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChkYXRhLmJvb3N0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFNldHRsZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlc1RvU2V0dGxlID0gaHRteC5jb25maWcuYXR0cmlidXRlc1RvU2V0dGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzVG9TZXR0bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09PSBhdHRyaWJ1dGVzVG9TZXR0bGVbaV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZVRvXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VGcm9tXG4gICAqL1xuICBmdW5jdGlvbiBjbG9uZUF0dHJpYnV0ZXMobWVyZ2VUbywgbWVyZ2VGcm9tKSB7XG4gICAgZm9yRWFjaChtZXJnZVRvLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmICghbWVyZ2VGcm9tLmhhc0F0dHJpYnV0ZShhdHRyLm5hbWUpICYmIHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8ucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2gobWVyZ2VGcm9tLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmIChzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKHRhcmdldClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChleHRlbnNpb24uaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3R5bGUgPT09ICdvdXRlckhUTUwnXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9vYlZhbHVlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gb29iRWxlbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgbGV0IHNlbGVjdG9yID0gJyMnICsgZ2V0UmF3QXR0cmlidXRlKG9vYkVsZW1lbnQsICdpZCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3R5bGUgKi9cbiAgICBsZXQgc3dhcFN0eWxlID0gJ291dGVySFRNTCdcbiAgICBpZiAob29iVmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAob29iVmFsdWUuaW5kZXhPZignOicpID4gMCkge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWUuc3Vic3RyKDAsIG9vYlZhbHVlLmluZGV4T2YoJzonKSlcbiAgICAgIHNlbGVjdG9yID0gb29iVmFsdWUuc3Vic3RyKG9vYlZhbHVlLmluZGV4T2YoJzonKSArIDEsIG9vYlZhbHVlLmxlbmd0aClcbiAgICB9IGVsc2Uge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIGlmICh0YXJnZXRzKSB7XG4gICAgICBmb3JFYWNoKFxuICAgICAgICB0YXJnZXRzLFxuICAgICAgICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgICBsZXQgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50Q2xvbmUgPSBvb2JFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgIGZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChvb2JFbGVtZW50Q2xvbmUpXG4gICAgICAgICAgaWYgKCFpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGFzUGFyZW50Tm9kZShvb2JFbGVtZW50Q2xvbmUpIC8vIGlmIHRoaXMgaXMgbm90IGFuIGlubGluZSBzd2FwLCB3ZSB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUsIG5vdCB0aGUgbm9kZSBpdHNlbGZcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVTd2FwRGV0YWlscyA9IHsgc2hvdWxkU3dhcDogdHJ1ZSwgdGFyZ2V0LCBmcmFnbWVudCB9XG4gICAgICAgICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpvb2JCZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgICAgICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICAgICAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIHRhcmdldCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6b29iQWZ0ZXJTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpvb2JFcnJvck5vVGFyZ2V0JywgeyBjb250ZW50OiBvb2JFbGVtZW50IH0pXG4gICAgfVxuICAgIHJldHVybiBvb2JWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KSB7XG4gICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXByZXNlcnZlXSwgW2RhdGEtaHgtcHJlc2VydmVdJyksIGZ1bmN0aW9uKHByZXNlcnZlZEVsdCkge1xuICAgICAgY29uc3QgaWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShwcmVzZXJ2ZWRFbHQsICdpZCcpXG4gICAgICBjb25zdCBvbGRFbHQgPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgaWYgKG9sZEVsdCAhPSBudWxsKSB7XG4gICAgICAgIHByZXNlcnZlZEVsdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChvbGRFbHQsIHByZXNlcnZlZEVsdClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSwgZnVuY3Rpb24obmV3Tm9kZSkge1xuICAgICAgY29uc3QgaWQgPSBnZXRSYXdBdHRyaWJ1dGUobmV3Tm9kZSwgJ2lkJylcbiAgICAgIGlmIChpZCAmJiBpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IGlkLnJlcGxhY2UoXCInXCIsIFwiXFxcXCdcIilcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IG5ld05vZGUudGFnTmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JylcbiAgICAgICAgY29uc3QgcGFyZW50RWx0ID0gYXNQYXJlbnROb2RlKHBhcmVudE5vZGUpXG4gICAgICAgIGNvbnN0IG9sZE5vZGUgPSBwYXJlbnRFbHQgJiYgcGFyZW50RWx0LnF1ZXJ5U2VsZWN0b3Iobm9ybWFsaXplZFRhZyArIFwiW2lkPSdcIiArIG5vcm1hbGl6ZWRJZCArIFwiJ11cIilcbiAgICAgICAgaWYgKG9sZE5vZGUgJiYgb2xkTm9kZSAhPT0gcGFyZW50RWx0KSB7XG4gICAgICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IG5ld05vZGUuY2xvbmVOb2RlKClcbiAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgb2xkTm9kZSlcbiAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgbmV3QXR0cmlidXRlcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGNoaWxkXG4gICAqIEByZXR1cm5zIHtIdG14U2V0dGxlVGFza31cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VBamF4TG9hZFRhc2soY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcHJvY2Vzc05vZGUoYXNFbGVtZW50KGNoaWxkKSlcbiAgICAgIHByb2Nlc3NGb2N1cyhhc1BhcmVudE5vZGUoY2hpbGQpKVxuICAgICAgdHJpZ2dlckV2ZW50KGNoaWxkLCAnaHRteDpsb2FkJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBjaGlsZFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0ZvY3VzKGNoaWxkKSB7XG4gICAgY29uc3QgYXV0b2ZvY3VzID0gJ1thdXRvZm9jdXNdJ1xuICAgIGNvbnN0IGF1dG9Gb2N1c2VkRWx0ID0gYXNIdG1sRWxlbWVudChtYXRjaGVzKGNoaWxkLCBhdXRvZm9jdXMpID8gY2hpbGQgOiBjaGlsZC5xdWVyeVNlbGVjdG9yKGF1dG9mb2N1cykpXG4gICAgaWYgKGF1dG9Gb2N1c2VkRWx0ICE9IG51bGwpIHtcbiAgICAgIGF1dG9Gb2N1c2VkRWx0LmZvY3VzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7Tm9kZX0gaW5zZXJ0QmVmb3JlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0QmVmb3JlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgd2hpbGUgKGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkXG4gICAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoY2hpbGQpLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGluc2VydEJlZm9yZSlcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmFzZWQgb24gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vaHlhbWFtb3RvL2ZkNDM1NTA1ZDI5ZWJmYTNkOTcxNmZkMmJlOGQ0MmYwLFxuICAgKiBkZXJpdmVkIGZyb20gSmF2YSdzIHN0cmluZyBoYXNoY29kZSBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdIYXNoKHN0cmluZywgaGFzaCkge1xuICAgIGxldCBjaGFyID0gMFxuICAgIHdoaWxlIChjaGFyIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0cmluZy5jaGFyQ29kZUF0KGNoYXIrKykgfCAwIC8vIGJpdHdpc2Ugb3IgZW5zdXJlcyB3ZSBoYXZlIGEgMzItYml0IGludFxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhdHRyaWJ1dGVIYXNoKGVsdCkge1xuICAgIGxldCBoYXNoID0gMFxuICAgIC8vIElFIGZpeFxuICAgIGlmIChlbHQuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBlbHQuYXR0cmlidXRlc1tpXVxuICAgICAgICBpZiAoYXR0cmlidXRlLnZhbHVlKSB7IC8vIG9ubHkgaW5jbHVkZSBhdHRyaWJ1dGVzIHcvIGFjdHVhbCB2YWx1ZXMgKGVtcHR5IGlzIHNhbWUgYXMgbm9uLWV4aXN0ZW50KVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS5uYW1lLCBoYXNoKVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS52YWx1ZSwgaGFzaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0T25IYW5kbGVycyhlbHQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEub25IYW5kbGVycykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbERhdGEub25IYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5mbyA9IGludGVybmFsRGF0YS5vbkhhbmRsZXJzW2ldXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGVsdCwgaGFuZGxlckluZm8uZXZlbnQsIGhhbmRsZXJJbmZvLmxpc3RlbmVyKVxuICAgICAgfVxuICAgICAgZGVsZXRlIGludGVybmFsRGF0YS5vbkhhbmRsZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0Tm9kZShlbGVtZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsZW1lbnQpXG4gICAgaWYgKGludGVybmFsRGF0YS50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZXJuYWxEYXRhLnRpbWVvdXQpXG4gICAgfVxuICAgIGlmIChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcykge1xuICAgICAgZm9yRWFjaChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcywgZnVuY3Rpb24oaW5mbykge1xuICAgICAgICBpZiAoaW5mby5vbikge1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGluZm8ub24sIGluZm8udHJpZ2dlciwgaW5mby5saXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVJbml0T25IYW5kbGVycyhlbGVtZW50KVxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoaW50ZXJuYWxEYXRhKSwgZnVuY3Rpb24oa2V5KSB7IGRlbGV0ZSBpbnRlcm5hbERhdGFba2V5XSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5VcEVsZW1lbnQoZWxlbWVudCkge1xuICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpXG4gICAgZGVJbml0Tm9kZShlbGVtZW50KVxuICAgIC8vIEB0cy1pZ25vcmUgSUUxMSBjb2RlXG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7IC8vIElFXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JFYWNoKGVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7IGNsZWFuVXBFbGVtZW50KGNoaWxkKSB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRhcmdldC50YWdOYW1lID09PSAnQk9EWScpIHsgLy8gc3BlY2lhbCBjYXNlIHRoZSBib2R5IHRvIGlubmVySFRNTCBiZWNhdXNlIERvY3VtZW50RnJhZ21lbnRzIGNhbid0IGNvbnRhaW4gYSBib2R5IGVsdCB1bmZvcnR1bmF0ZWx5XG4gICAgICByZXR1cm4gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cbiAgICAvKiogQHR5cGUge05vZGV9ICovXG4gICAgbGV0IG5ld0VsdFxuICAgIGNvbnN0IGVsdEJlZm9yZU5ld0NvbnRlbnQgPSB0YXJnZXQucHJldmlvdXNTaWJsaW5nXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGVsdEJlZm9yZU5ld0NvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgbmV3RWx0ID0gcGFyZW50RWx0KHRhcmdldCkuZmlyc3RDaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbHQgPSBlbHRCZWZvcmVOZXdDb250ZW50Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIHNldHRsZUluZm8uZWx0cyA9IHNldHRsZUluZm8uZWx0cy5maWx0ZXIoZnVuY3Rpb24oZSkgeyByZXR1cm4gZSAhPT0gdGFyZ2V0IH0pXG4gICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBuZXdseSBhZGRlZCBjb250ZW50IGFuZCBhZGQgYWxsIGVsZW1lbnRzIHRvIHRoZSBzZXR0bGUgaW5mbyBzbyB3ZSB0cmlnZ2VyXG4gICAgLy8gZXZlbnRzIHByb3Blcmx5IG9uIHRoZW1cbiAgICB3aGlsZSAobmV3RWx0ICYmIG5ld0VsdCAhPT0gdGFyZ2V0KSB7XG4gICAgICBpZiAobmV3RWx0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICBzZXR0bGVJbmZvLmVsdHMucHVzaChuZXdFbHQpXG4gICAgICB9XG4gICAgICBuZXdFbHQgPSBuZXdFbHQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICB0YXJnZXQucmVtb3ZlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCB0YXJnZXQuZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIG51bGwsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldC5uZXh0U2libGluZywgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBEZWxldGUodGFyZ2V0KSB7XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIHJldHVybiBwYXJlbnRFbHQodGFyZ2V0KS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBjb25zdCBmaXJzdENoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGRcbiAgICBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIGZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICB3aGlsZSAoZmlyc3RDaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgIH1cbiAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQpXG4gICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgc3dpdGNoIChzd2FwU3R5bGUpIHtcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ291dGVySFRNTCc6XG4gICAgICAgIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmJlZ2luJzpcbiAgICAgICAgc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmViZWdpbic6XG4gICAgICAgIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWVuZCc6XG4gICAgICAgIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmVuZCc6XG4gICAgICAgIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHN3YXBEZWxldGUodGFyZ2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyhlbHQpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbaV1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudHMgPSBleHQuaGFuZGxlU3dhcChzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaGFuZGxlU3dhcCByZXR1cm5zIGFuIGFycmF5IChsaWtlKSBvZiBlbGVtZW50cywgd2UgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5ld0VsZW1lbnRzW2pdXG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzd2FwU3R5bGUgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICAgICAgc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3YXBXaXRoU3R5bGUoaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHZhciBvb2JFbHRzID0gZmluZEFsbChmcmFnbWVudCwgJ1toeC1zd2FwLW9vYl0sIFtkYXRhLWh4LXN3YXAtb29iXScpXG4gICAgZm9yRWFjaChvb2JFbHRzLCBmdW5jdGlvbihvb2JFbGVtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dOZXN0ZWRPb2JTd2FwcyB8fCBvb2JFbGVtZW50LnBhcmVudEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShvb2JFbGVtZW50LCAnaHgtc3dhcC1vb2InKVxuICAgICAgICBpZiAob29iVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoeC1zd2FwLW9vYicpXG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWh4LXN3YXAtb29iJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBvb2JFbHRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGNvbXBsZXRlIHN3YXBwaW5nIHBpcGVsaW5lLCBpbmNsdWRpbmc6IGZvY3VzIGFuZCBzZWxlY3Rpb24gcHJlc2VydmF0aW9uLFxuICAgKiB0aXRsZSB1cGRhdGVzLCBzY3JvbGwsIE9PQiBzd2FwcGluZywgbm9ybWFsIHN3YXBwaW5nIGFuZCBzZXR0bGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqIEBwYXJhbSB7U3dhcE9wdGlvbnN9IFtzd2FwT3B0aW9uc11cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXAodGFyZ2V0LCBjb250ZW50LCBzd2FwU3BlYywgc3dhcE9wdGlvbnMpIHtcbiAgICBpZiAoIXN3YXBPcHRpb25zKSB7XG4gICAgICBzd2FwT3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCh0YXJnZXQpXG5cbiAgICAvLyBwcmVzZXJ2ZSBmb2N1cyBhbmQgc2VsZWN0aW9uXG4gICAgY29uc3QgYWN0aXZlRWx0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICAgIGxldCBzZWxlY3Rpb25JbmZvID0ge31cbiAgICB0cnkge1xuICAgICAgc2VsZWN0aW9uSW5mbyA9IHtcbiAgICAgICAgZWx0OiBhY3RpdmVFbHQsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc3RhcnQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25TdGFydCA6IG51bGwsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZW5kOiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uRW5kIDogbnVsbFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhZmFyaSBpc3N1ZSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3BsYXl3cmlnaHQvaXNzdWVzLzU4OTRcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKHRhcmdldClcblxuICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgc3dhcHMsIGRvbid0IHBhcnNlIHRoZSByZXNwb25zZSBhcyBIVE1MLCBqdXN0IGluc2VydCBpdFxuICAgIGlmIChzd2FwU3BlYy5zd2FwU3R5bGUgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGZyYWdtZW50IGFuZCBwcm9jZXNzIGl0XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjb250ZW50KVxuXG4gICAgICBzZXR0bGVJbmZvLnRpdGxlID0gZnJhZ21lbnQudGl0bGVcblxuICAgICAgLy8gc2VsZWN0LW9vYiBzd2Fwc1xuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdE9PQikge1xuICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZXMgPSBzd2FwT3B0aW9ucy5zZWxlY3RPT0Iuc3BsaXQoJywnKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9vYlNlbGVjdFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlID0gb29iU2VsZWN0VmFsdWVzW2ldLnNwbGl0KCc6JywgMilcbiAgICAgICAgICBsZXQgaWQgPSBvb2JTZWxlY3RWYWx1ZVswXS50cmltKClcbiAgICAgICAgICBpZiAoaWQuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZygxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlWzFdIHx8ICd0cnVlJ1xuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKVxuICAgICAgICAgIGlmIChvb2JFbGVtZW50KSB7XG4gICAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb29iIHN3YXBzXG4gICAgICBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAndGVtcGxhdGUnKSwgLyoqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgKi9mdW5jdGlvbih0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoZmluZEFuZFN3YXBPb2JFbGVtZW50cyh0ZW1wbGF0ZS5jb250ZW50LCBzZXR0bGVJbmZvKSkge1xuICAgICAgICAgIC8vIEF2b2lkIHBvbGx1dGluZyB0aGUgRE9NIHdpdGggZW1wdHkgdGVtcGxhdGVzIHRoYXQgd2VyZSBvbmx5IHVzZWQgdG8gZW5jYXBzdWxhdGUgb29iIHN3YXBcbiAgICAgICAgICB0ZW1wbGF0ZS5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBub3JtYWwgc3dhcFxuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdCkge1xuICAgICAgICBjb25zdCBuZXdGcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbChzd2FwT3B0aW9ucy5zZWxlY3QpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgbmV3RnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZ21lbnQgPSBuZXdGcmFnbWVudFxuICAgICAgfVxuICAgICAgaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpXG4gICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTcGVjLnN3YXBTdHlsZSwgc3dhcE9wdGlvbnMuY29udGV4dEVsZW1lbnQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgc2F2ZWQgZm9jdXMgYW5kIHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB0byBzd2FwcGVkIGNvbnRlbnRcbiAgICBpZiAoc2VsZWN0aW9uSW5mby5lbHQgJiZcbiAgICAgICFib2R5Q29udGFpbnMoc2VsZWN0aW9uSW5mby5lbHQpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKSB7XG4gICAgICBjb25zdCBuZXdBY3RpdmVFbHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKVxuICAgICAgY29uc3QgZm9jdXNPcHRpb25zID0geyBwcmV2ZW50U2Nyb2xsOiBzd2FwU3BlYy5mb2N1c1Njcm9sbCAhPT0gdW5kZWZpbmVkID8gIXN3YXBTcGVjLmZvY3VzU2Nyb2xsIDogIWh0bXguY29uZmlnLmRlZmF1bHRGb2N1c1Njcm9sbCB9XG4gICAgICBpZiAobmV3QWN0aXZlRWx0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHNlbGVjdGlvbkluZm8uc3RhcnQgJiYgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25JbmZvLnN0YXJ0LCBzZWxlY3Rpb25JbmZvLmVuZClcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGUgc2V0U2VsZWN0aW9uUmFuZ2UgbWV0aG9kIGlzIHByZXNlbnQgb24gZmllbGRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCwgc28ganVzdCBsZXQgdGhpcyBmYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUVsdC5mb2N1cyhmb2N1c09wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcbiAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTd2FwJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgIH0pXG4gICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKSB7XG4gICAgICBzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHRpdGxlIGFmdGVyIHN3YXAgYnV0IGJlZm9yZSBzZXR0bGVcbiAgICBpZiAoIXN3YXBTcGVjLmlnbm9yZVRpdGxlKSB7XG4gICAgICBoYW5kbGVUaXRsZShzZXR0bGVJbmZvLnRpdGxlKVxuICAgIH1cblxuICAgIC8vIHNldHRsZVxuICAgIGNvbnN0IGRvU2V0dGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8udGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgICAgdGFzay5jYWxsKClcbiAgICAgIH0pXG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclNldHRsZScsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICAgIH0pXG5cbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hbmNob3IpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFyZ2V0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoJyMnICsgc3dhcE9wdGlvbnMuYW5jaG9yKSlcbiAgICAgICAgaWYgKGFuY2hvclRhcmdldCkge1xuICAgICAgICAgIGFuY2hvclRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogJ2F1dG8nIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlU2Nyb2xsU3RhdGUoc2V0dGxlSW5mby5lbHRzLCBzd2FwU3BlYylcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKSB7XG4gICAgICAgIHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzd2FwU3BlYy5zZXR0bGVEZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9TZXR0bGUsIHN3YXBTcGVjLnNldHRsZURlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBkb1NldHRsZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsIGhlYWRlciwgZWx0KSB7XG4gICAgY29uc3QgdHJpZ2dlckJvZHkgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKVxuICAgIGlmICh0cmlnZ2VyQm9keS5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJzID0gcGFyc2VKU09OKHRyaWdnZXJCb2R5KVxuICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdHJpZ2dlcnMpIHtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsZXQgZGV0YWlsID0gdHJpZ2dlcnNbZXZlbnROYW1lXVxuICAgICAgICAgIGlmIChpc1Jhd09iamVjdChkZXRhaWwpKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbHQgPSBkZXRhaWwudGFyZ2V0ICE9PSB1bmRlZmluZWQgPyBkZXRhaWwudGFyZ2V0IDogZWx0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHsgdmFsdWU6IGRldGFpbCB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0cmlnZ2VyQm9keS5zcGxpdCgnLCcpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lc1tpXS50cmltKCksIFtdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzL1xuICBjb25zdCBXSElURVNQQUNFX09SX0NPTU1BID0gL1tcXHMsXS9cbiAgY29uc3QgU1lNQk9MX1NUQVJUID0gL1tfJGEtekEtWl0vXG4gIGNvbnN0IFNZTUJPTF9DT05UID0gL1tfJGEtekEtWjAtOV0vXG4gIGNvbnN0IFNUUklOR0lTSF9TVEFSVCA9IFsnXCInLCBcIidcIiwgJy8nXVxuICBjb25zdCBOT1RfV0hJVEVTUEFDRSA9IC9bXlxcc10vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX1NUQVJUID0gL1t7KF0vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX0VORCA9IC9bfSldL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaW5nKHN0cikge1xuICAgIC8qKiBAdHlwZSBzdHJpbmdbXSAqL1xuICAgIGNvbnN0IHRva2VucyA9IFtdXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgIGlmIChTWU1CT0xfU1RBUlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uKSkpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICB3aGlsZSAoU1lNQk9MX0NPTlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uICsgMSkpKSB7XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2UgaWYgKFNUUklOR0lTSF9TVEFSVC5pbmRleE9mKHN0ci5jaGFyQXQocG9zaXRpb24pKSAhPT0gLTEpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDaGFyID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGggJiYgc3RyLmNoYXJBdChwb3NpdGlvbikgIT09IHN0YXJ0Q2hhcikge1xuICAgICAgICAgIGlmIChzdHIuY2hhckF0KHBvc2l0aW9uKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgICAgfVxuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdG9rZW5zLnB1c2goc3ltYm9sKVxuICAgICAgfVxuICAgICAgcG9zaXRpb24rK1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIFNZTUJPTF9TVEFSVC5leGVjKHRva2VuLmNoYXJBdCgwKSkgJiZcbiAgICAgIHRva2VuICE9PSAndHJ1ZScgJiZcbiAgICAgIHRva2VuICE9PSAnZmFsc2UnICYmXG4gICAgICB0b2tlbiAhPT0gJ3RoaXMnICYmXG4gICAgICB0b2tlbiAhPT0gcGFyYW1OYW1lICYmXG4gICAgICBsYXN0ICE9PSAnLidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtDb25kaXRpb25hbEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsIHBhcmFtTmFtZSkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICdbJykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIGxldCBicmFja2V0Q291bnQgPSAxXG4gICAgICBsZXQgY29uZGl0aW9uYWxTb3VyY2UgPSAnIHJldHVybiAoZnVuY3Rpb24oJyArIHBhcmFtTmFtZSArICcpeyByZXR1cm4gKCdcbiAgICAgIGxldCBsYXN0ID0gbnVsbFxuICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zWzBdXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIHNoaWZ0IGNhbGwsIGFuZCB0aGlua3Mgd2UncmUgY29tcGFyaW5nIHRoZSBzYW1lIHZhbHVlIGhlcmUsIGkuZS4gJ1snIHZzICddJ1xuICAgICAgICBpZiAodG9rZW4gPT09ICddJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudC0tXG4gICAgICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArICd0cnVlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcpfSknXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25GdW5jdGlvbiA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihjb25kaXRpb25hbFNvdXJjZSkoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSlcbiAgICAgICAgICAgICAgY29uZGl0aW9uRnVuY3Rpb24uc291cmNlID0gY29uZGl0aW9uYWxTb3VyY2VcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlOiBjb25kaXRpb25hbFNvdXJjZSB9KVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1snKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50KytcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJygoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgPyAoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgOiAod2luZG93LicgKyB0b2tlbiArICcpKSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgdG9rZW5cbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7UmVnRXhwfSBtYXRjaFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZVVudGlsKHRva2VucywgbWF0Y2gpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgIW1hdGNoLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgcmVzdWx0ICs9IHRva2Vucy5zaGlmdCgpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0XG4gICAgaWYgKHRva2Vucy5sZW5ndGggPiAwICYmIENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIENPTUJJTkVEX1NFTEVDVE9SX0VORCkudHJpbSgpXG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBJTlBVVF9TRUxFQ1RPUiA9ICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCdcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGxpY2l0VHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgZm9yIHRyaWdnZXIgc3BlY3NcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKSB7XG4gICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdICovXG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gW11cbiAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZyhleHBsaWNpdFRyaWdnZXIpXG4gICAgZG8ge1xuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gdG9rZW5zLmxlbmd0aFxuICAgICAgY29uc3QgdHJpZ2dlciA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKVxuICAgICAgaWYgKHRyaWdnZXIgIT09ICcnKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyID09PSAnZXZlcnknKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IGV2ZXJ5ID0geyB0cmlnZ2VyOiAnZXZlcnknIH1cbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICBldmVyeS5wb2xsSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKSlcbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICBldmVyeS5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKGV2ZXJ5KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCB0cmlnZ2VyU3BlYyA9IHsgdHJpZ2dlciB9XG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdICE9PSAnLCcpIHtcbiAgICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKHRva2VuID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdvbmNlJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5vbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2NvbnN1bWUnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNvbnN1bWUgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZGVsYXknICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmRlbGF5ID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdmcm9tJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICBpZiAoQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgICAgIGlmIChmcm9tX2FyZyA9PT0gJ2Nsb3Nlc3QnIHx8IGZyb21fYXJnID09PSAnZmluZCcgfHwgZnJvbV9hcmcgPT09ICduZXh0JyB8fCBmcm9tX2FyZyA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgICAgIC8vIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBhbGxvdyBhIHNlbGVjdG9yLWxlc3Mgc3ludGF4XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tX2FyZyArPSAnICcgKyBzZWxlY3RvclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5mcm9tID0gZnJvbV9hcmdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0YXJnZXQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRhcmdldCA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyb3R0bGUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRocm90dGxlID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdxdWV1ZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMucXVldWUgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Jvb3QnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyZXNob2xkJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaCh0cmlnZ2VyU3BlYylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IGluaXRpYWxMZW5ndGgpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgfVxuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgfSB3aGlsZSAodG9rZW5zWzBdID09PSAnLCcgJiYgdG9rZW5zLnNoaWZ0KCkpXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtleHBsaWNpdFRyaWdnZXJdID0gdHJpZ2dlclNwZWNzXG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmlnZ2VyU3BlY3MoZWx0KSB7XG4gICAgY29uc3QgZXhwbGljaXRUcmlnZ2VyID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdHJpZ2dlcicpXG4gICAgbGV0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgaWYgKGV4cGxpY2l0VHJpZ2dlcikge1xuICAgICAgY29uc3QgY2FjaGUgPSBodG14LmNvbmZpZy50cmlnZ2VyU3BlY3NDYWNoZVxuICAgICAgdHJpZ2dlclNwZWNzID0gKGNhY2hlICYmIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0pIHx8IHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSlcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlclNwZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnZm9ybScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ3N1Ym1pdCcgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsIElOUFVUX1NFTEVDVE9SKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjaGFuZ2UnIH1dXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBjYW5jZWxQb2xsaW5nKGVsdCkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQpLmNhbmNlbGxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBzcGVjXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgbm9kZURhdGEudGltZW91dCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoYm9keUNvbnRhaW5zKGVsdCkgJiYgbm9kZURhdGEuY2FuY2VsbGVkICE9PSB0cnVlKSB7XG4gICAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudChzcGVjLCBlbHQsIG1ha2VFdmVudCgnaHg6cG9sbDp0cmlnZ2VyJywge1xuICAgICAgICAgIHRyaWdnZXJTcGVjOiBzcGVjLFxuICAgICAgICAgIHRhcmdldDogZWx0XG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYylcbiAgICAgIH1cbiAgICB9LCBzcGVjLnBvbGxJbnRlcnZhbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0xvY2FsTGluayhlbHQpIHtcbiAgICByZXR1cm4gbG9jYXRpb24uaG9zdG5hbWUgPT09IGVsdC5ob3N0bmFtZSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZWx0SXNEaXNhYmxlZChlbHQpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICovXG4gIGZ1bmN0aW9uIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBpZiAoKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGlzTG9jYWxMaW5rKGVsdCkgJiYgKGVsdC50YXJnZXQgPT09ICcnIHx8IGVsdC50YXJnZXQgPT09ICdfc2VsZicpKSB8fCAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBTdHJpbmcoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpKS50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykpIHtcbiAgICAgIG5vZGVEYXRhLmJvb3N0ZWQgPSB0cnVlXG4gICAgICBsZXQgdmVyYiwgcGF0aFxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgdmVyYiA9ICdnZXQnXG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByYXdBdHRyaWJ1dGUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJylcbiAgICAgICAgdmVyYiA9IHJhd0F0dHJpYnV0ZSA/IHJhd0F0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpIDogJ2dldCdcbiAgICAgICAgaWYgKHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdhY3Rpb24nKVxuICAgICAgfVxuICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICB9LCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIHRydWUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsKGV2dCwgbm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGV2dC50eXBlID09PSAnc3VibWl0JyB8fCBldnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJzdWJtaXRcIl0sIGJ1dHRvbicpICYmIGNsb3Nlc3QoZWx0LCAnZm9ybScpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWx0LmhyZWYgJiZcbiAgICAgICAgKGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PT0gJyMnIHx8IGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDApKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR8TW91c2VFdmVudHxLZXlib2FyZEV2ZW50fFRvdWNoRXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiBlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBldnQudHlwZSA9PT0gJ2NsaWNrJyAmJlxuICAgICAgLy8gQHRzLWlnbm9yZSB0aGlzIHdpbGwgcmVzb2x2ZSB0byB1bmRlZmluZWQgZm9yIGV2ZW50cyB0aGF0IGRvbid0IGRlZmluZSB0aG9zZSBwcm9wZXJ0aWVzLCB3aGljaCBpcyBmaW5lXG4gICAgICAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXIgPSB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlclxuICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2ZW50RmlsdGVyLmNhbGwoZWx0LCBldnQpICE9PSB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50RmlsdGVyLnNvdXJjZVxuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmV2ZW50RmlsdGVyOmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4cGxpY2l0Q2FuY2VsXVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgZXhwbGljaXRDYW5jZWwpIHtcbiAgICBjb25zdCBlbGVtZW50RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgLyoqIEB0eXBlIHsoTm9kZXxXaW5kb3cpW119ICovXG4gICAgbGV0IGVsdHNUb0xpc3Rlbk9uXG4gICAgaWYgKHRyaWdnZXJTcGVjLmZyb20pIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHRyaWdnZXJTcGVjLmZyb20pXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gW2VsdF1cbiAgICB9XG4gICAgLy8gc3RvcmUgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBlbGVtZW50cywgc28gd2UgY2FuIHRlbGwgaWYgdGhleSBjaGFuZ2VcbiAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgZWx0c1RvTGlzdGVuT24uZm9yRWFjaChmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICB9KVxuICAgIH1cbiAgICBmb3JFYWNoKGVsdHNUb0xpc3Rlbk9uLCBmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgZWx0VG9MaXN0ZW5Pbi5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGxpY2l0Q2FuY2VsIHx8IHNob3VsZENhbmNlbChldnQsIGVsdCkpIHtcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZ0KVxuICAgICAgICBldmVudERhdGEudHJpZ2dlclNwZWMgPSB0cmlnZ2VyU3BlY1xuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IgPT0gbnVsbCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IuaW5kZXhPZihlbHQpIDwgMCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yLnB1c2goZWx0KVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jb25zdW1lKSB7XG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRhcmdldCAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMoYXNFbGVtZW50KGV2dC50YXJnZXQpLCB0cmlnZ2VyU3BlYy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMub25jZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICAgICAgICBpZiAoZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5kZWxheWVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbWVudERhdGEuZGVsYXllZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGhyb3R0bGUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBudWxsXG4gICAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLnRocm90dGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMuZGVsYXkgPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5kZWxheWVkID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPT0gbnVsbCkge1xuICAgICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zID0gW11cbiAgICAgIH1cbiAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MucHVzaCh7XG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXJTcGVjLnRyaWdnZXIsXG4gICAgICAgIGxpc3RlbmVyOiBldmVudExpc3RlbmVyLFxuICAgICAgICBvbjogZWx0VG9MaXN0ZW5PblxuICAgICAgfSlcbiAgICAgIGVsdFRvTGlzdGVuT24uYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgIH0pXG4gIH1cblxuICBsZXQgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZSAvLyB1c2VkIGJ5IGluaXRTY3JvbGxIYW5kbGVyXG4gIGxldCBzY3JvbGxIYW5kbGVyID0gbnVsbFxuICBmdW5jdGlvbiBpbml0U2Nyb2xsSGFuZGxlcigpIHtcbiAgICBpZiAoIXNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSB0cnVlXG4gICAgICB9XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcilcbiAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAod2luZG93SXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlXG4gICAgICAgICAgZm9yRWFjaChnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcio9J3JldmVhbGVkJ10sW2RhdGEtaHgtdHJpZ2dlcio9J3JldmVhbGVkJ11cIiksIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgbWF5YmVSZXZlYWwoZWx0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlUmV2ZWFsKGVsdCkge1xuICAgIGlmICghaGFzQXR0cmlidXRlKGVsdCwgJ2RhdGEtaHgtcmV2ZWFsZWQnKSAmJiBpc1Njcm9sbGVkSW50b1ZpZXcoZWx0KSkge1xuICAgICAgZWx0LnNldEF0dHJpYnV0ZSgnZGF0YS1oeC1yZXZlYWxlZCcsICd0cnVlJylcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSByZXF1ZXN0XG4gICAgICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCBmdW5jdGlvbigpIHsgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJykgfSwgeyBvbmNlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRJbW1lZGlhdGVseShlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCBkZWxheSkge1xuICAgIGNvbnN0IGxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghbm9kZURhdGEubG9hZGVkKSB7XG4gICAgICAgIG5vZGVEYXRhLmxvYWRlZCA9IHRydWVcbiAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQobG9hZCwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgbGV0IGV4cGxpY2l0QWN0aW9uID0gZmFsc2VcbiAgICBmb3JFYWNoKFZFUkJTLCBmdW5jdGlvbih2ZXJiKSB7XG4gICAgICBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LScgKyB2ZXJiKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtJyArIHZlcmIpXG4gICAgICAgIGV4cGxpY2l0QWN0aW9uID0gdHJ1ZVxuICAgICAgICBub2RlRGF0YS5wYXRoID0gcGF0aFxuICAgICAgICBub2RlRGF0YS52ZXJiID0gdmVyYlxuICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZXhwbGljaXRBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAY2FsbGJhY2sgVHJpZ2dlckhhbmRsZXJcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gW2V2dF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqL1xuICBmdW5jdGlvbiBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgaGFuZGxlcikge1xuICAgIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAncmV2ZWFsZWQnKSB7XG4gICAgICBpbml0U2Nyb2xsSGFuZGxlcigpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgICAgbWF5YmVSZXZlYWwoYXNFbGVtZW50KGVsdCkpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnaW50ZXJzZWN0Jykge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJPcHRpb25zID0ge31cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy5yb290KSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy5yb290ID0gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRyaWdnZXJTcGVjLnJvb3QpXG4gICAgICB9XG4gICAgICBpZiAodHJpZ2dlclNwZWMudGhyZXNob2xkKSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy50aHJlc2hvbGQgPSBwYXJzZUZsb2F0KHRyaWdnZXJTcGVjLnRocmVzaG9sZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldXG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaW50ZXJzZWN0JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBvYnNlcnZlck9wdGlvbnMpXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGFzRWxlbWVudChlbHQpKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2xvYWQnKSB7XG4gICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgbWFrZUV2ZW50KCdsb2FkJywgeyBlbHQgfSkpKSB7XG4gICAgICAgIGxvYWRJbW1lZGlhdGVseShhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMucG9sbEludGVydmFsID4gMCkge1xuICAgICAgbm9kZURhdGEucG9sbGluZyA9IHRydWVcbiAgICAgIHByb2Nlc3NQb2xsaW5nKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkUHJvY2Vzc0h4T24obm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGVsdC5hdHRyaWJ1dGVzXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal0ubmFtZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbjonKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbjonKSB8fFxuICAgICAgICBzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb24tJykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb24tJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGNvbnN0IEhYX09OX1FVRVJZID0gbmV3IFhQYXRoRXZhbHVhdG9yKClcbiAgICAuY3JlYXRlRXhwcmVzc2lvbignLi8vKltAKlsgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uOlwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbjpcIikgb3InICtcbiAgICAgICcgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uLVwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbi1cIikgXV0nKVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKSB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NIeE9uKGVsdCkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KGVsdCkpXG4gICAgfVxuICAgIGNvbnN0IGl0ZXIgPSBIWF9PTl9RVUVSWS5ldmFsdWF0ZShlbHQpXG4gICAgbGV0IG5vZGUgPSBudWxsXG4gICAgd2hpbGUgKG5vZGUgPSBpdGVyLml0ZXJhdGVOZXh0KCkpIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KG5vZGUpKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCkge1xuICAgIC8qKiBAdHlwZSB7RWxlbWVudFtdfSAqL1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW11cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbHQuY2hpbGROb2Rlcykge1xuICAgICAgICBwcm9jZXNzSFhPblJvb3QoY2hpbGQsIGVsZW1lbnRzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cylcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD58W119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSB7XG4gICAgaWYgKGVsdC5xdWVyeVNlbGVjdG9yQWxsKSB7XG4gICAgICBjb25zdCBib29zdGVkU2VsZWN0b3IgPSAnLCBbaHgtYm9vc3RdIGEsIFtkYXRhLWh4LWJvb3N0XSBhLCBhW2h4LWJvb3N0XSwgYVtkYXRhLWh4LWJvb3N0XSdcblxuICAgICAgY29uc3QgZXh0ZW5zaW9uU2VsZWN0b3JzID0gW11cbiAgICAgIGZvciAoY29uc3QgZSBpbiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZV1cbiAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXh0ZW5zaW9uLmdldFNlbGVjdG9ycygpXG4gICAgICAgICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2VsZWN0b3JzLnB1c2goc2VsZWN0b3JzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoVkVSQl9TRUxFQ1RPUiArIGJvb3N0ZWRTZWxlY3RvciArIFwiLCBmb3JtLCBbdHlwZT0nc3VibWl0J10sXCIgK1xuICAgICAgICAnIFtoeC1leHRdLCBbZGF0YS1oeC1leHRdLCBbaHgtdHJpZ2dlcl0sIFtkYXRhLWh4LXRyaWdnZXJdJyArIGV4dGVuc2lvblNlbGVjdG9ycy5mbGF0KCkubWFwKHMgPT4gJywgJyArIHMpLmpvaW4oJycpKVxuXG4gICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSAqLyAoY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKSlcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IGVsdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YXx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlc29sdmVUYXJnZXQoJyMnICsgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSwgZWx0LmdldFJvb3ROb2RlKCkpIHx8IGNsb3Nlc3QoZWx0LCAnZm9ybScpXG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdEJ1dHRvblRyYWNraW5nKGVsdCkge1xuICAgIC8vIG5lZWQgdG8gaGFuZGxlIGJvdGggY2xpY2sgYW5kIGZvY3VzIGluOlxuICAgIC8vICAgZm9jdXNpbiAtIGluIGNhc2Ugc29tZW9uZSB0YWJzIGluIHRvIGEgYnV0dG9uIGFuZCBoaXRzIHRoZSBzcGFjZSBiYXJcbiAgICAvLyAgIGNsaWNrIC0gb24gT1NYIGJ1dHRvbnMgZG8gbm90IGZvY3VzIG9uIGNsaWNrIHNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MjRcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgY29kZSkge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZURhdGEub25IYW5kbGVycykpIHtcbiAgICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMgPSBbXVxuICAgIH1cbiAgICBsZXQgZnVuY1xuICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgY29uc3QgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgICBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2V2ZW50JywgY29kZSlcbiAgICAgICAgfVxuICAgICAgICBmdW5jLmNhbGwoZWx0LCBlKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICBub2RlRGF0YS5vbkhhbmRsZXJzLnB1c2goeyBldmVudDogZXZlbnROYW1lLCBsaXN0ZW5lciB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSHhPbldpbGRjYXJkKGVsdCkge1xuICAgIC8vIHdpcGUgYW55IHByZXZpb3VzIG9uIGhhbmRsZXJzIHNvIHRoYXQgdGhpcyBmdW5jdGlvbiB0YWtlcyBwcmVjZWRlbmNlXG4gICAgZGVJbml0T25IYW5kbGVycyhlbHQpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gZWx0LmF0dHJpYnV0ZXNbaV0ubmFtZVxuICAgICAgY29uc3QgdmFsdWUgPSBlbHQuYXR0cmlidXRlc1tpXS52YWx1ZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgobmFtZSwgJ2h4LW9uJykgfHwgc3RhcnRzV2l0aChuYW1lLCAnZGF0YS1oeC1vbicpKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyT25Qb3NpdGlvbiA9IG5hbWUuaW5kZXhPZignLW9uJykgKyAzXG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24sIGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gJy0nIHx8IG5leHRDaGFyID09PSAnOicpIHtcbiAgICAgICAgICBsZXQgZXZlbnROYW1lID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICAgIC8vIGlmIHRoZSBldmVudE5hbWUgc3RhcnRzIHdpdGggYSBjb2xvbiBvciBkYXNoLCBwcmVwZW5kIFwiaHRteFwiIGZvciBzaG9ydGhhbmQgc3VwcG9ydFxuICAgICAgICAgIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJzonKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXgnICsgZXZlbnROYW1lXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJy0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSgxKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICdodG14LScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdE5vZGUoZWx0KSB7XG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCAhPT0gYXR0cmlidXRlSGFzaChlbHQpKSB7XG4gICAgICAvLyBjbGVhbiB1cCBhbnkgcHJldmlvdXNseSBwcm9jZXNzZWQgaW5mb1xuICAgICAgZGVJbml0Tm9kZShlbHQpXG5cbiAgICAgIG5vZGVEYXRhLmluaXRIYXNoID0gYXR0cmlidXRlSGFzaChlbHQpXG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJylcblxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBpZiAoZWx0LnZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbm9kZURhdGEubGFzdFZhbHVlID0gZWx0LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGdldFRyaWdnZXJTcGVjcyhlbHQpXG4gICAgICBjb25zdCBoYXNFeHBsaWNpdEh0dHBBY3Rpb24gPSBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuXG4gICAgICBpZiAoIWhhc0V4cGxpY2l0SHR0cEFjdGlvbikge1xuICAgICAgICBpZiAoZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWJvb3N0JykgPT09ICd0cnVlJykge1xuICAgICAgICAgIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXRyaWdnZXInKSkge1xuICAgICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgICAvLyBGb3IgXCJuYWtlZFwiIHRyaWdnZXJzLCBkb24ndCBkbyBhbnl0aGluZyBhdCBhbGxcbiAgICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScgfHwgKGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnICYmIGhhc0F0dHJpYnV0ZShlbHQsICdmb3JtJykpKSB7XG4gICAgICAgIGluaXRCdXR0b25UcmFja2luZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgbmV3IGNvbnRlbnQsIGVuYWJsaW5nIGh0bXggYmVoYXZpb3IuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSBub3JtYWwgaHRteCByZXF1ZXN0IGN5Y2xlIGJ1dCBzdGlsbCB3YW50IGh0bXggYXR0cmlidXRlcyB0byB3b3JrLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwcm9jZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCBlbGVtZW50IHRvIHByb2Nlc3NcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKGVsdCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXROb2RlKGVsdClcbiAgICBmb3JFYWNoKGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpLCBmdW5jdGlvbihjaGlsZCkgeyBpbml0Tm9kZShjaGlsZCkgfSlcbiAgICBmb3JFYWNoKGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpLCBwcm9jZXNzSHhPbldpbGRjYXJkKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXZlbnQvTG9nIFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAvLyBUaGlzIGJyZWFrcyBleHBlY3RlZCBlbmNhcHN1bGF0aW9uIGJ1dCBuZWVkcyB0byBiZSBoZXJlIHVudGlsIGRlY2lkZWQgb3RoZXJ3aXNlIGJ5IGNvcmUgZGV2c1xuICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV2dCA9IGdldERvY3VtZW50KCkuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWxcbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBldmVudE5hbWUgfSwgZGV0YWlsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBldmVudE5hbWUgPT09ICdodG14OmFmdGVyUHJvY2Vzc05vZGUnXG4gIH1cblxuICAvKipcbiAgICogYHdpdGhFeHRlbnNpb25zYCBsb2NhdGVzIGFsbCBhY3RpdmUgZXh0ZW5zaW9ucyBmb3IgYSBwcm92aWRlZCBlbGVtZW50LCB0aGVuXG4gICAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1c2luZyBlYWNoIG9mIHRoZSBhY3RpdmUgZXh0ZW5zaW9ucy4gIEl0IHNob3VsZFxuICAgKiBiZSBjYWxsZWQgaW50ZXJuYWxseSBhdCBldmVyeSBleHRlbmRhYmxlIGV4ZWN1dGlvbiBwb2ludCBpbiBodG14LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0geyhleHRlbnNpb246SHRteEV4dGVuc2lvbikgPT4gdm9pZH0gdG9Eb1xuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBmdW5jdGlvbiB3aXRoRXh0ZW5zaW9ucyhlbHQsIHRvRG8pIHtcbiAgICBmb3JFYWNoKGdldEV4dGVuc2lvbnMoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0b0RvKGV4dGVuc2lvbilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nRXJyb3IobXNnKSB7XG4gICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFUlJPUjogJywgbXNnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIGdpdmVuIGV2ZW50IG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdHJpZ2dlclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGV2ZW50IG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWwgZGV0YWlscyBmb3IgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGV0YWlsID09IG51bGwpIHtcbiAgICAgIGRldGFpbCA9IHt9XG4gICAgfVxuICAgIGRldGFpbC5lbHQgPSBlbHRcbiAgICBjb25zdCBldmVudCA9IG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbClcbiAgICBpZiAoaHRteC5sb2dnZXIgJiYgIWlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpKSB7XG4gICAgICBodG14LmxvZ2dlcihlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIH1cbiAgICBpZiAoZGV0YWlsLmVycm9yKSB7XG4gICAgICBsb2dFcnJvcihkZXRhaWwuZXJyb3IpXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDplcnJvcicsIHsgZXJyb3JJbmZvOiBkZXRhaWwgfSlcbiAgICB9XG4gICAgbGV0IGV2ZW50UmVzdWx0ID0gZWx0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgY29uc3Qga2ViYWJOYW1lID0ga2ViYWJFdmVudE5hbWUoZXZlbnROYW1lKVxuICAgIGlmIChldmVudFJlc3VsdCAmJiBrZWJhYk5hbWUgIT09IGV2ZW50TmFtZSkge1xuICAgICAgY29uc3Qga2ViYWJlZEV2ZW50ID0gbWFrZUV2ZW50KGtlYmFiTmFtZSwgZXZlbnQuZGV0YWlsKVxuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiBlbHQuZGlzcGF0Y2hFdmVudChrZWJhYmVkRXZlbnQpXG4gICAgfVxuICAgIHdpdGhFeHRlbnNpb25zKGFzRWxlbWVudChlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgKGV4dGVuc2lvbi5vbkV2ZW50KGV2ZW50TmFtZSwgZXZlbnQpICE9PSBmYWxzZSAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICB9KVxuICAgIHJldHVybiBldmVudFJlc3VsdFxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGlzdG9yeSBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGxldCBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlFbGVtZW50KCkge1xuICAgIGNvbnN0IGhpc3RvcnlFbHQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJylcbiAgICByZXR1cm4gaGlzdG9yeUVsdCB8fCBnZXREb2N1bWVudCgpLmJvZHlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsdFxuICAgKi9cbiAgZnVuY3Rpb24gc2F2ZVRvSGlzdG9yeUNhY2hlKHVybCwgcm9vdEVsdCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBzdGF0ZSB0byBzYXZlXG4gICAgY29uc3QgaW5uZXJIVE1MID0gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KHJvb3RFbHQpXG4gICAgY29uc3QgdGl0bGUgPSBnZXREb2N1bWVudCgpLnRpdGxlXG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFlcblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplIDw9IDApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIGV2ZW50dWFsbHkgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBpcyBwdXJnZWRcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIGhpc3RvcnlDYWNoZS5zcGxpY2UoaSwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUgSHRteEhpc3RvcnlJdGVtICovXG4gICAgY29uc3QgbmV3SGlzdG9yeUl0ZW0gPSB7IHVybCwgY29udGVudDogaW5uZXJIVE1MLCB0aXRsZSwgc2Nyb2xsIH1cblxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlJdGVtQ3JlYXRlZCcsIHsgaXRlbTogbmV3SGlzdG9yeUl0ZW0sIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcblxuICAgIGhpc3RvcnlDYWNoZS5wdXNoKG5ld0hpc3RvcnlJdGVtKVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSkge1xuICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KClcbiAgICB9XG5cbiAgICAvLyBrZWVwIHRyeWluZyB0byBzYXZlIHRoZSBjYWNoZSB1bnRpbCBpdCBzdWNjZWVkcyBvciBpcyBlbXB0eVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnlDYWNoZSkpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlRXJyb3InLCB7IGNhdXNlOiBlLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG4gICAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpIC8vIHNocmluayB0aGUgY2FjaGUgYW5kIHJldHJ5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5SXRlbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc2Nyb2xsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEByZXR1cm5zIHtIdG14SGlzdG9yeUl0ZW18bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENhY2hlZEhpc3RvcnkodXJsKSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlDYWNoZVtpXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhbklubmVySHRtbEZvckhpc3RvcnkoZWx0KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaHRteC5jb25maWcucmVxdWVzdENsYXNzXG4gICAgY29uc3QgY2xvbmUgPSAvKiogQHR5cGUgRWxlbWVudCAqLyAoZWx0LmNsb25lTm9kZSh0cnVlKSlcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICcuJyArIGNsYXNzTmFtZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGFzc05hbWUpXG4gICAgfSlcbiAgICAvLyByZW1vdmUgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBmb3IgYW55IGVsZW1lbnQgZGlzYWJsZWQgZHVlIHRvIGFuIGh0bXggcmVxdWVzdFxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJ1tkYXRhLWRpc2FibGVkLWJ5LWh0bXhdJyksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICB9KVxuICAgIHJldHVybiBjbG9uZS5pbm5lckhUTUxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpIHtcbiAgICBjb25zdCBlbHQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgY29uc3QgcGF0aCA9IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gICAgLy8gQWxsb3cgaGlzdG9yeSBzbmFwc2hvdCBmZWF0dXJlIHRvIGJlIGRpc2FibGVkIHdoZXJlIGh4LWhpc3Rvcnk9XCJmYWxzZVwiXG4gICAgLy8gaXMgcHJlc2VudCAqYW55d2hlcmUqIGluIHRoZSBjdXJyZW50IGRvY3VtZW50IHdlJ3JlIGFib3V0IHRvIHNhdmUsXG4gICAgLy8gc28gd2UgY2FuIHByZXZlbnQgcHJpdmlsZWdlZCBkYXRhIGVudGVyaW5nIHRoZSBjYWNoZS5cbiAgICAvLyBUaGUgcGFnZSB3aWxsIHN0aWxsIGJlIHJlYWNoYWJsZSBhcyBhIGhpc3RvcnkgZW50cnksIGJ1dCBodG14IHdpbGwgZmV0Y2ggaXRcbiAgICAvLyBsaXZlIGZyb20gdGhlIHNlcnZlciBvbnBvcHN0YXRlIHJhdGhlciB0aGFuIGxvb2sgaW4gdGhlIGxvY2FsU3RvcmFnZSBjYWNoZVxuICAgIGxldCBkaXNhYmxlSGlzdG9yeUNhY2hlXG4gICAgdHJ5IHtcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIiBpXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIiBpXScpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFMTE6IGluc2Vuc2l0aXZlIG1vZGlmaWVyIG5vdCBzdXBwb3J0ZWQgc28gZmFsbGJhY2sgdG8gY2FzZSBzZW5zaXRpdmUgc2VsZWN0b3JcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIl0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCJdJylcbiAgICB9XG4gICAgaWYgKCFkaXNhYmxlSGlzdG9yeUNhY2hlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5U2F2ZScsIHsgcGF0aCwgaGlzdG9yeUVsdDogZWx0IH0pXG4gICAgICBzYXZlVG9IaXN0b3J5Q2FjaGUocGF0aCwgZWx0KVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sIGdldERvY3VtZW50KCkudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBwdXNoVXJsSW50b0hpc3RvcnkocGF0aCkge1xuICAvLyByZW1vdmUgdGhlIGNhY2hlIGJ1c3RlciBwYXJhbWV0ZXIsIGlmIGFueVxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9vcmdcXC5odG14XFwuY2FjaGUtYnVzdGVyPVteJl0qJj8vLCAnJylcbiAgICAgIGlmIChlbmRzV2l0aChwYXRoLCAnJicpIHx8IGVuZHNXaXRoKHBhdGgsICc/JykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIH1cbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VVcmxJbkhpc3RvcnkocGF0aCkge1xuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gICAqL1xuICBmdW5jdGlvbiBzZXR0bGVJbW1lZGlhdGVseSh0YXNrcykge1xuICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgIHRhc2suY2FsbCh1bmRlZmluZWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBjb25zdCBkZXRhaWxzID0geyBwYXRoLCB4aHI6IHJlcXVlc3QgfVxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3MnLCBkZXRhaWxzKVxuICAgIHJlcXVlc3Qub3BlbignR0VUJywgcGF0aCwgdHJ1ZSlcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUN1cnJlbnQtVVJMJywgZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmKVxuICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkJywgZGV0YWlscylcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQodGhpcy5yZXNwb25zZSlcbiAgICAgICAgLyoqIEB0eXBlIFBhcmVudE5vZGUgKi9cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJykgfHwgZnJhZ21lbnRcbiAgICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG5cbiAgICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgY29udGVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgY2FjaGVNaXNzOiB0cnVlLCBzZXJ2ZXJSZXNwb25zZTogdGhpcy5yZXNwb25zZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZEVycm9yJywgZGV0YWlscylcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5zZW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlSGlzdG9yeShwYXRoKSB7XG4gICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICBwYXRoID0gcGF0aCB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZEhpc3RvcnkocGF0aClcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjYWNoZWQuY29udGVudClcbiAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG4gICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgY2FjaGVkLnNjcm9sbClcbiAgICAgIH0sIDApIC8vIG5leHQgJ3RpY2snLCBzbyBicm93c2VyIGhhcyB0aW1lIHRvIHJlbmRlciBsYXlvdXRcbiAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBpdGVtOiBjYWNoZWQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGh0bXguY29uZmlnLnJlZnJlc2hPbkhpc3RvcnlNaXNzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IG9wdGlvbmFsIHBhcmFtZXRlciBpbiByZWxvYWQoKSBmdW5jdGlvbiB0aHJvd3MgZXJyb3JcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdCkge1xuICAgIGxldCBpbmRpY2F0b3JzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5kaWNhdG9yJykpXG4gICAgaWYgKGluZGljYXRvcnMgPT0gbnVsbCkge1xuICAgICAgaW5kaWNhdG9ycyA9IFtlbHRdXG4gICAgfVxuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGljLmNsYXNzTGlzdC5hZGQuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICB9KVxuICAgIHJldHVybiBpbmRpY2F0b3JzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGRpc2FibGVFbGVtZW50cyhlbHQpIHtcbiAgICBsZXQgZGlzYWJsZWRFbHRzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtZGlzYWJsZWQtZWx0JykpXG4gICAgaWYgKGRpc2FibGVkRWx0cyA9PSBudWxsKSB7XG4gICAgICBkaXNhYmxlZEVsdHMgPSBbXVxuICAgIH1cbiAgICBmb3JFYWNoKGRpc2FibGVkRWx0cywgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJylcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcsICcnKVxuICAgIH0pXG4gICAgcmV0dXJuIGRpc2FibGVkRWx0c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBpbmRpY2F0b3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZWQpIHtcbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBpYy5jbGFzc0xpc3QucmVtb3ZlLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKGRpc2FibGVkLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IFZhbHVlIFByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gcHJvY2Vzc2VkW2ldXG4gICAgICBpZiAobm9kZS5pc1NhbWVOb2RlKGVsdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRJbmNsdWRlKGVsZW1lbnQpIHtcbiAgICAvLyBDYXN0IHRvIHRyaWNrIHRzYywgdW5kZWZpbmVkIHZhbHVlcyB3aWxsIHdvcmsgZmluZSBoZXJlXG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyAoZWxlbWVudClcbiAgICBpZiAoZWx0Lm5hbWUgPT09ICcnIHx8IGVsdC5uYW1lID09IG51bGwgfHwgZWx0LmRpc2FibGVkIHx8IGNsb3Nlc3QoZWx0LCAnZmllbGRzZXRbZGlzYWJsZWRdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBpZ25vcmUgXCJzdWJtaXR0ZXJcIiB0eXBlcyAoc2VlIGpRdWVyeSBzcmMvc2VyaWFsaXplLmpzKVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2J1dHRvbicgfHwgZWx0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGVsdC50YWdOYW1lID09PSAnaW1hZ2UnIHx8IGVsdC50YWdOYW1lID09PSAncmVzZXQnIHx8IGVsdC50YWdOYW1lID09PSAnZmlsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZWx0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWx0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybiBlbHQuY2hlY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fEZvcm1EYXRhRW50cnlWYWx1ZX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHZhbHVlcyA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2YWx1ZS5pbmRleE9mKHYpIDwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgZm9yRWFjaCh2YWx1ZXMsIHYgPT4gZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSkge1xuICAgIGlmIChlbHQgPT0gbnVsbCB8fCBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkLnB1c2goZWx0KVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW5jbHVkZShlbHQpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKVxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBsZXQgdmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBlbHQubXVsdGlwbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb246Y2hlY2tlZCcpKS5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gKC8qKiBAdHlwZSBIVE1MT3B0aW9uRWxlbWVudCAqLyhlKSkudmFsdWUgfSlcbiAgICAgIH1cbiAgICAgIC8vIGluY2x1ZGUgZmlsZSBpbnB1dHNcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGVsdC5maWxlcykge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LmZpbGVzKVxuICAgICAgfVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZWx0LmVsZW1lbnRzLCBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAocHJvY2Vzc2VkLmluZGV4T2YoaW5wdXQpID49IDApIHtcbiAgICAgICAgICAvLyBUaGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZXMsIGJ1dCB0aGUgRm9ybURhdGEgdGhhdCB3aWxsIGJlXG4gICAgICAgICAgLy8gIGNvbnN0cnVjdGVkIHJpZ2h0IGFmdGVyIG9uIHRoZSBmb3JtLCB3aWxsIGluY2x1ZGUgaXQgb25jZSBhZ2Fpbi4gU28gcmVtb3ZlIHRoYXQgaW5wdXQncyB2YWx1ZVxuICAgICAgICAgIC8vICBub3cgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKGlucHV0Lm5hbWUsIGlucHV0LnZhbHVlLCBmb3JtRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWQucHVzaChpbnB1dClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoaW5wdXQsIGVycm9ycylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIG5ldyBGb3JtRGF0YShlbHQpLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSAmJiB2YWx1ZS5uYW1lID09PSAnJykge1xuICAgICAgICAgIHJldHVybiAvLyBpZ25vcmUgbm8tbmFtZSBmaWxlc1xuICAgICAgICB9XG4gICAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKi9cbiAgZnVuY3Rpb24gdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnQgJiBFbGVtZW50SW50ZXJuYWxzfSAqLyAoZWx0KVxuICAgIGlmIChlbGVtZW50LndpbGxWYWxpZGF0ZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246dmFsaWRhdGUnKVxuICAgICAgaWYgKCFlbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGVsdDogZWxlbWVudCwgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246ZmFpbGVkJywgeyBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB2YWx1ZXMgaW4gdGhlIG9uZSBGb3JtRGF0YSB3aXRoIHRob3NlIGZyb20gYW5vdGhlci5cbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gcmVjZWl2ZXIgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBiZSBtdXRhdGVkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRvbm9yIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgb3ZlcnJpZGluZyB2YWx1ZXNcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSB0aGUge0BsaW5rY29kZSByZWNlaXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJyaWRlRm9ybURhdGEocmVjZWl2ZXIsIGRvbm9yKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZG9ub3Iua2V5cygpKSB7XG4gICAgICByZWNlaXZlci5kZWxldGUoa2V5KVxuICAgIH1cbiAgICBkb25vci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlY2VpdmVyLmFwcGVuZChrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJlY2VpdmVyXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICogQHJldHVybnMge3tlcnJvcnM6IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10sIGZvcm1EYXRhOiBGb3JtRGF0YSwgdmFsdWVzOiBPYmplY3R9fVxuICovXG4gIGZ1bmN0aW9uIGdldElucHV0VmFsdWVzKGVsdCwgdmVyYikge1xuICAgIC8qKiBAdHlwZSBFbGVtZW50W10gKi9cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBbXVxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBjb25zdCBwcmlvcml0eUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAvKiogQHR5cGUgSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkICYmICFib2R5Q29udGFpbnMoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cblxuICAgIC8vIG9ubHkgdmFsaWRhdGUgd2hlbiBmb3JtIGlzIGRpcmVjdGx5IHN1Ym1pdHRlZCBhbmQgbm92YWxpZGF0ZSBvciBmb3Jtbm92YWxpZGF0ZSBhcmUgbm90IHNldFxuICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBoeC12YWxpZGF0ZT1cInRydWVcIiBvbiBpdFxuICAgIGxldCB2YWxpZGF0ZSA9IChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgJiYgZWx0Lm5vVmFsaWRhdGUgIT09IHRydWUpIHx8IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXZhbGlkYXRlJykgPT09ICd0cnVlJ1xuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgIHZhbGlkYXRlID0gdmFsaWRhdGUgJiYgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkLmZvcm1Ob1ZhbGlkYXRlICE9PSB0cnVlXG4gICAgfVxuXG4gICAgLy8gZm9yIGEgbm9uLUdFVCBpbmNsdWRlIHRoZSBjbG9zZXN0IGZvcm1cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgcHJpb3JpdHlGb3JtRGF0YSwgZXJyb3JzLCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSwgdmFsaWRhdGUpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpXG5cbiAgICAvLyBpZiBhIGJ1dHRvbiBvciBzdWJtaXQgd2FzIGNsaWNrZWQgbGFzdCwgaW5jbHVkZSBpdHMgdmFsdWVcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8IGVsdC50YWdOYW1lID09PSAnQlVUVE9OJyB8fFxuICAgIChlbHQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JykpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCAoLyoqIEB0eXBlIEhUTUxJbnB1dEVsZW1lbnR8SFRNTEJ1dHRvbkVsZW1lbnQgKi8oZWx0KSlcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoYnV0dG9uLCAnbmFtZScpXG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgYnV0dG9uLnZhbHVlLCBwcmlvcml0eUZvcm1EYXRhKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgYW55IGV4cGxpY2l0IGluY2x1ZGVzXG4gICAgY29uc3QgaW5jbHVkZXMgPSBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmNsdWRlJylcbiAgICBmb3JFYWNoKGluY2x1ZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGFzRWxlbWVudChub2RlKSwgdmFsaWRhdGUpXG4gICAgICAvLyBpZiBhIG5vbi1mb3JtIGlzIGluY2x1ZGVkLCBpbmNsdWRlIGFueSBpbnB1dCB2YWx1ZXMgd2l0aGluIGl0XG4gICAgICBpZiAoIW1hdGNoZXMobm9kZSwgJ2Zvcm0nKSkge1xuICAgICAgICBmb3JFYWNoKGFzUGFyZW50Tm9kZShub2RlKS5xdWVyeVNlbGVjdG9yQWxsKElOUFVUX1NFTEVDVE9SKSwgZnVuY3Rpb24oZGVzY2VuZGFudCkge1xuICAgICAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZGVzY2VuZGFudCwgdmFsaWRhdGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIHZhbHVlcyBmcm9tIGEgPGZvcm0+IHRha2UgcHJlY2VkZW5jZSwgb3ZlcnJpZGluZyB0aGUgcmVndWxhciB2YWx1ZXNcbiAgICBvdmVycmlkZUZvcm1EYXRhKGZvcm1EYXRhLCBwcmlvcml0eUZvcm1EYXRhKVxuXG4gICAgcmV0dXJuIHsgZXJyb3JzLCBmb3JtRGF0YSwgdmFsdWVzOiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldHVyblN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gcmVhbFZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIG5hbWUsIHJlYWxWYWx1ZSkge1xuICAgIGlmIChyZXR1cm5TdHIgIT09ICcnKSB7XG4gICAgICByZXR1cm5TdHIgKz0gJyYnXG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVhbFZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJlYWxWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHJlYWxWYWx1ZSlcbiAgICB9XG4gICAgY29uc3QgcyA9IGVuY29kZVVSSUNvbXBvbmVudChyZWFsVmFsdWUpXG4gICAgcmV0dXJuU3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIHNcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YXxPYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGZ1bmN0aW9uIHVybEVuY29kZSh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBmb3JtRGF0YUZyb21PYmplY3QodmFsdWVzKVxuICAgIGxldCByZXR1cm5TdHIgPSAnJ1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVyblN0ciA9IGFwcGVuZFBhcmFtKHJldHVyblN0ciwga2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFqYXhcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IHByb21wdFxuICogQHJldHVybnMge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdCkge1xuICAgIC8qKiBAdHlwZSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnSFgtUmVxdWVzdCc6ICd0cnVlJyxcbiAgICAgICdIWC1UcmlnZ2VyJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2lkJyksXG4gICAgICAnSFgtVHJpZ2dlci1OYW1lJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKSxcbiAgICAgICdIWC1UYXJnZXQnOiBnZXRBdHRyaWJ1dGVWYWx1ZSh0YXJnZXQsICdpZCcpLFxuICAgICAgJ0hYLUN1cnJlbnQtVVJMJzogZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuICAgIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtaGVhZGVycycsIGZhbHNlLCBoZWFkZXJzKVxuICAgIGlmIChwcm9tcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snSFgtUHJvbXB0J10gPSBwcm9tcHRcbiAgICB9XG4gICAgaWYgKGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLUJvb3N0ZWQnXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgLyoqXG4gKiBmaWx0ZXJWYWx1ZXMgdGFrZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZm9ybSBpbnB1dCB2YWx1ZXNcbiAqIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMga2V5cyB0aGF0IGFyZVxuICogc3BlY2lmaWVkIGJ5IHRoZSBjbG9zZXN0IFwiaHgtcGFyYW1zXCIgYXR0cmlidXRlXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBpbnB1dFZhbHVlc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBmaWx0ZXJWYWx1ZXMoaW5wdXRWYWx1ZXMsIGVsdCkge1xuICAgIGNvbnN0IHBhcmFtc1ZhbHVlID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXBhcmFtcycpXG4gICAgaWYgKHBhcmFtc1ZhbHVlKSB7XG4gICAgICBpZiAocGFyYW1zVmFsdWUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUgPT09ICcqJykge1xuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUuaW5kZXhPZignbm90ICcpID09PSAwKSB7XG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3Vic3RyKDQpLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpbnB1dFZhbHVlcy5kZWxldGUobmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpZiAoaW5wdXRWYWx1ZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlcy5nZXRBbGwobmFtZSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBuZXdWYWx1ZXMuYXBwZW5kKG5hbWUsIHZhbHVlKSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzQW5jaG9yTGluayhlbHQpIHtcbiAgICByZXR1cm4gISFnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpID49IDBcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gW3N3YXBJbmZvT3ZlcnJpZGVdXG4gKiBAcmV0dXJucyB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcEluZm9PdmVycmlkZSkge1xuICAgIGNvbnN0IHN3YXBJbmZvID0gc3dhcEluZm9PdmVycmlkZSB8fCBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3dhcCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IHN3YXBTcGVjID0ge1xuICAgICAgc3dhcFN0eWxlOiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkID8gJ2lubmVySFRNTCcgOiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLFxuICAgICAgc3dhcERlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcERlbGF5LFxuICAgICAgc2V0dGxlRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTZXR0bGVEZWxheVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuc2Nyb2xsSW50b1ZpZXdPbkJvb3N0ICYmIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgIWlzQW5jaG9yTGluayhlbHQpKSB7XG4gICAgICBzd2FwU3BlYy5zaG93ID0gJ3RvcCdcbiAgICB9XG4gICAgaWYgKHN3YXBJbmZvKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IHNwbGl0T25XaGl0ZXNwYWNlKHN3YXBJbmZvKVxuICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3BsaXRbaV1cbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignc3dhcDonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcERlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNSkpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzZXR0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnNldHRsZURlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNykpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCd0cmFuc2l0aW9uOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy50cmFuc2l0aW9uID0gdmFsdWUuc3Vic3RyKDExKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdpZ25vcmVUaXRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSB2YWx1ZS5zdWJzdHIoMTIpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Njcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3BlYyA9IHZhbHVlLnN1YnN0cig3KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNjcm9sbFNwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGwgPSBzY3JvbGxWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbFRhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzaG93OicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaG93U3BlYyA9IHZhbHVlLnN1YnN0cig1KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNob3dTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNob3dWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3cgPSBzaG93VmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93VGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2ZvY3VzLXNjcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNTY3JvbGxWYWwgPSB2YWx1ZS5zdWJzdHIoJ2ZvY3VzLXNjcm9sbDonLmxlbmd0aClcbiAgICAgICAgICAgIHN3YXBTcGVjLmZvY3VzU2Nyb2xsID0gZm9jdXNTY3JvbGxWYWwgPT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBTdHlsZSA9IHZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKCdVbmtub3duIG1vZGlmaWVyIGluIGh4LXN3YXA6ICcgKyB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTcGVjXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHVzZXNGb3JtRGF0YShlbHQpIHtcbiAgICByZXR1cm4gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWVuY29kaW5nJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8fFxuICAgIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZW5jdHlwZScpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZpbHRlcmVkUGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7KnxzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkUGFyYW1ldGVycykge1xuICAgIGxldCBlbmNvZGVkUGFyYW1ldGVycyA9IG51bGxcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgICAgZW5jb2RlZFBhcmFtZXRlcnMgPSBleHRlbnNpb24uZW5jb2RlUGFyYW1ldGVycyh4aHIsIGZpbHRlcmVkUGFyYW1ldGVycywgZWx0KVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGVkUGFyYW1ldGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgICAgLy8gRm9yY2UgY29udmVyc2lvbiB0byBhbiBhY3R1YWwgRm9ybURhdGEgb2JqZWN0IGluIGNhc2UgZmlsdGVyZWRQYXJhbWV0ZXJzIGlzIGEgZm9ybURhdGFQcm94eVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgvaXNzdWVzLzIzMTdcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRm9ybURhdGEobmV3IEZvcm1EYXRhKCksIGZvcm1EYXRhRnJvbU9iamVjdChmaWx0ZXJlZFBhcmFtZXRlcnMpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShmaWx0ZXJlZFBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtIdG14U2V0dGxlSW5mb31cbiAqL1xuICBmdW5jdGlvbiBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpIHtcbiAgICByZXR1cm4geyB0YXNrczogW10sIGVsdHM6IFt0YXJnZXRdIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKGNvbnRlbnQsIHN3YXBTcGVjKSB7XG4gICAgY29uc3QgZmlyc3QgPSBjb250ZW50WzBdXG4gICAgY29uc3QgbGFzdCA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXVxuICAgIGlmIChzd2FwU3BlYy5zY3JvbGwpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCBzd2FwU3BlYy5zY3JvbGxUYXJnZXQpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSAwXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzd2FwU3BlYy5zaG93KSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQpIHtcbiAgICAgICAgbGV0IHRhcmdldFN0ciA9IHN3YXBTcGVjLnNob3dUYXJnZXRcbiAgICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgdGFyZ2V0U3RyID0gJ2JvZHknXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHRhcmdldFN0cikpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGV2YWxBc0RlZmF1bHRcbiAqIEBwYXJhbSB7T2JqZWN0PX0gdmFsdWVzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHZhbHVlcyA9IHt9XG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlc1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cilcbiAgICBpZiAoYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIGxldCBzdHIgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKClcbiAgICAgIGxldCBldmFsdWF0ZVZhbHVlID0gZXZhbEFzRGVmYXVsdFxuICAgICAgaWYgKHN0ciA9PT0gJ3Vuc2V0Jykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMTEpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN0ci5pbmRleE9mKCdqczonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDMpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ3snKSAhPT0gMCkge1xuICAgICAgICBzdHIgPSAneycgKyBzdHIgKyAnfSdcbiAgICAgIH1cbiAgICAgIGxldCB2YXJzVmFsdWVzXG4gICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICB2YXJzVmFsdWVzID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7IHJldHVybiBGdW5jdGlvbigncmV0dXJuICgnICsgc3RyICsgJyknKSgpIH0sIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IHBhcnNlSlNPTihzdHIpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzVmFsdWVzKSB7XG4gICAgICAgIGlmICh2YXJzVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAodmFsdWVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YXJzVmFsdWVzW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHsoKSA9PiBhbnl9IHRvRXZhbFxuICAgKiBAcGFyYW0ge2FueT19IGRlZmF1bHRWYWxcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRXZhbChlbHQsIHRvRXZhbCwgZGVmYXVsdFZhbCkge1xuICAgIGlmIChodG14LmNvbmZpZy5hbGxvd0V2YWwpIHtcbiAgICAgIHJldHVybiB0b0V2YWwoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmV2YWxEaXNhbGxvd2VkRXJyb3InKVxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YXJzJywgdHJ1ZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YWxzJywgZmFsc2UsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGdldEV4cHJlc3Npb25WYXJzKGVsdCkge1xuICAgIHJldHVybiBtZXJnZU9iamVjdHMoZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQpLCBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gaGVhZGVyVmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSkge1xuICAgIGlmIChoZWFkZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE9uIGFuIGV4Y2VwdGlvbiwgdHJ5IHRvIHNldCB0aGUgaGVhZGVyIFVSSSBlbmNvZGVkIGluc3RlYWRcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBlbmNvZGVVUklDb21wb25lbnQoaGVhZGVyVmFsdWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIgKyAnLVVSSS1BdXRvRW5jb2RlZCcsICd0cnVlJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKSB7XG4gIC8vIE5COiBJRTExIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBzdHVmZlxuICAgIGlmICh4aHIucmVzcG9uc2VVUkwgJiYgdHlwZW9mIChVUkwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh4aHIucmVzcG9uc2VVUkwpXG4gICAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmFkUmVzcG9uc2VVcmwnLCB7IHVybDogeGhyLnJlc3BvbnNlVVJMIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXNIZWFkZXIoeGhyLCByZWdleHApIHtcbiAgICByZXR1cm4gcmVnZXhwLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlcyBhbiBodG14LXN0eWxlIEFKQVggcmVxdWVzdFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhamF4XG4gICAqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIFVSTCBwYXRoIHRvIG1ha2UgdGhlIEFKQVhcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ3xIdG14QWpheEhlbHBlckNvbnRleHR9IGNvbnRleHQgdGhlIGVsZW1lbnQgdG8gdGFyZ2V0IChkZWZhdWx0cyB0byB0aGUgKipib2R5KiopIHwgYSBzZWxlY3RvciBmb3IgdGhlIHRhcmdldCB8IGEgY29udGV4dCBvYmplY3QgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHkgaWYgbm8gcmVxdWVzdCBpcyBzZW50LCBvciB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBhamF4SGVscGVyKHZlcmIsIHBhdGgsIGNvbnRleHQpIHtcbiAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyh2ZXJiLnRvTG93ZXJDYXNlKCkpKVxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0KSxcbiAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCByZXNvbHZlVGFyZ2V0KGNvbnRleHQuc291cmNlKSwgY29udGV4dC5ldmVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoYW5kbGVyOiBjb250ZXh0LmhhbmRsZXIsXG4gICAgICAgICAgICBoZWFkZXJzOiBjb250ZXh0LmhlYWRlcnMsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbnRleHQudmFsdWVzLFxuICAgICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dC50YXJnZXQpLFxuICAgICAgICAgICAgc3dhcE92ZXJyaWRlOiBjb250ZXh0LnN3YXAsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnRleHQuc2VsZWN0LFxuICAgICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gaGllcmFyY2h5Rm9yRWx0KGVsdCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgd2hpbGUgKGVsdCkge1xuICAgICAgYXJyLnB1c2goZWx0KVxuICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHZlcmlmeVBhdGgoZWx0LCBwYXRoLCByZXF1ZXN0Q29uZmlnKSB7XG4gICAgbGV0IHNhbWVIb3N0XG4gICAgbGV0IHVybFxuICAgIGlmICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpXG4gICAgICBjb25zdCBvcmlnaW4gPSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIHNhbWVIb3N0ID0gb3JpZ2luID09PSB1cmwub3JpZ2luXG4gICAgfSBlbHNlIHtcbiAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBVUkxcbiAgICAgIHVybCA9IHBhdGhcbiAgICAgIHNhbWVIb3N0ID0gc3RhcnRzV2l0aChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLnNlbGZSZXF1ZXN0c09ubHkpIHtcbiAgICAgIGlmICghc2FtZUhvc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0ZVVybCcsIG1lcmdlT2JqZWN0cyh7IHVybCwgc2FtZUhvc3QgfSwgcmVxdWVzdENvbmZpZykpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R8Rm9ybURhdGF9IG9ialxuICAgKiBAcmV0dXJuIHtGb3JtRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9ybURhdGEpIHJldHVybiBvYmpcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChrZXksIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyAmJiAhKG9ialtrZXldIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBKU09OLnN0cmluZ2lmeShvYmpba2V5XSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFBcnJheVByb3h5KGZvcm1EYXRhLCBuYW1lLCBhcnJheSkge1xuICAgIC8vIG11dGF0aW5nIHRoZSBhcnJheSBzaG91bGQgbXV0YXRlIHRoZSB1bmRlcmx5aW5nIGZvcm0gZGF0YVxuICAgIHJldHVybiBuZXcgUHJveHkoYXJyYXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHJldHVybiB0YXJnZXQubGVuZ3RoXG4gICAgICAgIGlmIChrZXkgPT09ICdwdXNoJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godmFsdWUpXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0W2tleV0gJiYgdGFyZ2V0W2tleV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldWzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB2YWx1ZVxuICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmb3JtRGF0YSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIC8vIEZvcndhcmQgc3ltYm9sIGNhbGxzIHRvIHRoZSBGb3JtRGF0YSBpdHNlbGYgZGlyZWN0bHlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAndG9KU09OJykge1xuICAgICAgICAgIC8vIFN1cHBvcnQgSlNPTi5zdHJpbmdpZnkgY2FsbCBvbiBwcm94eVxuICAgICAgICAgIHJldHVybiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoZm9ybURhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgLy8gV3JhcCBpbiBmdW5jdGlvbiB3aXRoIGFwcGx5IHRvIGNvcnJlY3RseSBiaW5kIHRoZSBGb3JtRGF0YSBjb250ZXh0LCBhcyBhIGRpcmVjdCBjYWxsIHdvdWxkIHJlc3VsdCBpbiBhbiBpbGxlZ2FsIGludm9jYXRpb24gZXJyb3JcbiAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGFbbmFtZV0uYXBwbHkoZm9ybURhdGEsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnJheSA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgICAvLyBUaG9zZSAyIHVuZGVmaW5lZCAmIHNpbmdsZSB2YWx1ZSByZXR1cm5zIGFyZSBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eSBhcyB3ZSB3ZXJlbid0IHVzaW5nIEZvcm1EYXRhIGJlZm9yZVxuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBhcnJheVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmb3JtRGF0YUFycmF5UHJveHkodGFyZ2V0LCBuYW1lLCBhcnJheSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgdGFyZ2V0LmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFN1cHBvcnQgT2JqZWN0LmFzc2lnbiBjYWxsIGZyb20gcHJveHlcbiAgICAgIG93bktleXM6IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpKVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24odGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSwgcHJvcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtIdG14QWpheEV0Y30gW2V0Y11cbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uZmlybWVkXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsIGNvbmZpcm1lZCkge1xuICAgIGxldCByZXNvbHZlID0gbnVsbFxuICAgIGxldCByZWplY3QgPSBudWxsXG4gICAgZXRjID0gZXRjICE9IG51bGwgPyBldGMgOiB7fVxuICAgIGlmIChldGMucmV0dXJuUHJvbWlzZSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgIHJlamVjdCA9IF9yZWplY3RcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgZWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IGV0Yy5oYW5kbGVyIHx8IGhhbmRsZUFqYXhSZXNwb25zZVxuICAgIGNvbnN0IHNlbGVjdCA9IGV0Yy5zZWxlY3QgfHwgbnVsbFxuXG4gICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgIC8vIGRvIG5vdCBpc3N1ZSByZXF1ZXN0cyBmb3IgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoZSBET01cbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXRjLnRhcmdldE92ZXJyaWRlIHx8IGFzRWxlbWVudChnZXRUYXJnZXQoZWx0KSlcbiAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0ID09IERVTU1ZX0VMVCkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0YXJnZXRFcnJvcicsIHsgdGFyZ2V0OiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKSB9KVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgbGV0IGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGNvbnN0IHN1Ym1pdHRlciA9IGVsdERhdGEubGFzdEJ1dHRvbkNsaWNrZWRcblxuICAgIGlmIChzdWJtaXR0ZXIpIHtcbiAgICAgIGNvbnN0IGJ1dHRvblBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybWFjdGlvbicpXG4gICAgICBpZiAoYnV0dG9uUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIHBhdGggPSBidXR0b25QYXRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvblZlcmIgPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybW1ldGhvZCcpXG4gICAgICBpZiAoYnV0dG9uVmVyYiAhPSBudWxsKSB7XG4gICAgICAvLyBpZ25vcmUgYnV0dG9ucyB3aXRoIGZvcm1tZXRob2Q9XCJkaWFsb2dcIlxuICAgICAgICBpZiAoYnV0dG9uVmVyYi50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykge1xuICAgICAgICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKGJ1dHRvblZlcmIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybVF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWNvbmZpcm0nKVxuICAgIC8vIGFsbG93IGV2ZW50LWJhc2VkIGNvbmZpcm1hdGlvbiB3LyBhIGNhbGxiYWNrXG4gICAgaWYgKGNvbmZpcm1lZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc3N1ZVJlcXVlc3QgPSBmdW5jdGlvbihza2lwQ29uZmlybWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgISFza2lwQ29uZmlybWF0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlybURldGFpbHMgPSB7IHRhcmdldCwgZWx0LCBwYXRoLCB2ZXJiLCB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50LCBldGMsIGlzc3VlUmVxdWVzdCwgcXVlc3Rpb246IGNvbmZpcm1RdWVzdGlvbiB9XG4gICAgICBpZiAodHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlybScsIGNvbmZpcm1EZXRhaWxzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN5bmNFbHQgPSBlbHRcbiAgICBsZXQgc3luY1N0cmF0ZWd5ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN5bmMnKVxuICAgIGxldCBxdWV1ZVN0cmF0ZWd5ID0gbnVsbFxuICAgIGxldCBhYm9ydGFibGUgPSBmYWxzZVxuICAgIGlmIChzeW5jU3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN5bmNTdHJpbmdzID0gc3luY1N0cmF0ZWd5LnNwbGl0KCc6JylcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3luY1N0cmluZ3NbMF0udHJpbSgpXG4gICAgICBpZiAoc2VsZWN0b3IgPT09ICd0aGlzJykge1xuICAgICAgICBzeW5jRWx0ID0gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXN5bmMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3luY0VsdCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgc2VsZWN0b3IpKVxuICAgICAgfVxuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZHJvcCBzdHJhdGVneVxuICAgICAgc3luY1N0cmF0ZWd5ID0gKHN5bmNTdHJpbmdzWzFdIHx8ICdkcm9wJykudHJpbSgpXG4gICAgICBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHN5bmNFbHQpXG4gICAgICBpZiAoc3luY1N0cmF0ZWd5ID09PSAnZHJvcCcgJiYgZWx0RGF0YS54aHIgJiYgZWx0RGF0YS5hYm9ydGFibGUgIT09IHRydWUpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFib3J0YWJsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdyZXBsYWNlJykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kuaW5kZXhPZigncXVldWUnKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZVN0ckFycmF5ID0gc3luY1N0cmF0ZWd5LnNwbGl0KCcgJylcbiAgICAgICAgcXVldWVTdHJhdGVneSA9IChxdWV1ZVN0ckFycmF5WzFdIHx8ICdsYXN0JykudHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICBpZiAoZWx0RGF0YS5hYm9ydGFibGUpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldmVudClcbiAgICAgICAgICAgIGlmIChldmVudERhdGEgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZSkge1xuICAgICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAnbGFzdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgPT0gbnVsbCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnZmlyc3QnICYmIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnYWxsJykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdIC8vIGR1bXAgZXhpc3RpbmcgcXVldWVcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgZWx0RGF0YS54aHIgPSB4aHJcbiAgICBlbHREYXRhLmFib3J0YWJsZSA9IGFib3J0YWJsZVxuICAgIGNvbnN0IGVuZFJlcXVlc3RMb2NrID0gZnVuY3Rpb24oKSB7XG4gICAgICBlbHREYXRhLnhociA9IG51bGxcbiAgICAgIGVsdERhdGEuYWJvcnRhYmxlID0gZmFsc2VcbiAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzICE9IG51bGwgJiZcbiAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZWRSZXF1ZXN0ID0gZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5zaGlmdCgpXG4gICAgICAgIHF1ZXVlZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9tcHRRdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wcm9tcHQnKVxuICAgIGlmIChwcm9tcHRRdWVzdGlvbikge1xuICAgICAgdmFyIHByb21wdFJlc3BvbnNlID0gcHJvbXB0KHByb21wdFF1ZXN0aW9uKVxuICAgICAgLy8gcHJvbXB0IHJldHVybnMgbnVsbCBpZiBjYW5jZWxsZWQgYW5kIGVtcHR5IHN0cmluZyBpZiBhY2NlcHRlZCB3aXRoIG5vIGVudHJ5XG4gICAgICBpZiAocHJvbXB0UmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAgICF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpwcm9tcHQnLCB7IHByb21wdDogcHJvbXB0UmVzcG9uc2UsIHRhcmdldCB9KSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maXJtUXVlc3Rpb24gJiYgIWNvbmZpcm1lZCkge1xuICAgICAgaWYgKCFjb25maXJtKGNvbmZpcm1RdWVzdGlvbikpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaGVhZGVycyA9IGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdFJlc3BvbnNlKVxuXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnICYmICF1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgIH1cblxuICAgIGlmIChldGMuaGVhZGVycykge1xuICAgICAgaGVhZGVycyA9IG1lcmdlT2JqZWN0cyhoZWFkZXJzLCBldGMuaGVhZGVycylcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGdldElucHV0VmFsdWVzKGVsdCwgdmVyYilcbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnNcbiAgICBjb25zdCByYXdGb3JtRGF0YSA9IHJlc3VsdHMuZm9ybURhdGFcbiAgICBpZiAoZXRjLnZhbHVlcykge1xuICAgICAgb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZm9ybURhdGFGcm9tT2JqZWN0KGV0Yy52YWx1ZXMpKVxuICAgIH1cbiAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGZvcm1EYXRhRnJvbU9iamVjdChnZXRFeHByZXNzaW9uVmFycyhlbHQpKVxuICAgIGNvbnN0IGFsbEZvcm1EYXRhID0gb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZXhwcmVzc2lvblZhcnMpXG4gICAgbGV0IGZpbHRlcmVkRm9ybURhdGEgPSBmaWx0ZXJWYWx1ZXMoYWxsRm9ybURhdGEsIGVsdClcblxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtICYmIHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICBmaWx0ZXJlZEZvcm1EYXRhLnNldCgnb3JnLmh0bXguY2FjaGUtYnVzdGVyJywgZ2V0UmF3QXR0cmlidXRlKHRhcmdldCwgJ2lkJykgfHwgJ3RydWUnKVxuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIG9mIGFuY2hvcnMgdy8gZW1wdHkgaHJlZiBpcyB0byB1c2UgdGhlIGN1cnJlbnQgVVJMXG4gICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW25vSGVhZGVyc11cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0QXR0clZhbHVlcyA9IGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtcmVxdWVzdCcpXG5cbiAgICBjb25zdCBlbHRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgdXNlVXJsUGFyYW1zID0gaHRteC5jb25maWcubWV0aG9kc1RoYXRVc2VVcmxQYXJhbXMuaW5kZXhPZih2ZXJiKSA+PSAwXG5cbiAgICAvKiogQHR5cGUgSHRteFJlcXVlc3RDb25maWcgKi9cbiAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgdXNlVXJsUGFyYW1zLFxuICAgICAgZm9ybURhdGE6IGZpbHRlcmVkRm9ybURhdGEsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGZpbHRlcmVkRm9ybURhdGEpLFxuICAgICAgdW5maWx0ZXJlZEZvcm1EYXRhOiBhbGxGb3JtRGF0YSxcbiAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGFsbEZvcm1EYXRhKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB0YXJnZXQsXG4gICAgICB2ZXJiLFxuICAgICAgZXJyb3JzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBldGMuY3JlZGVudGlhbHMgfHwgcmVxdWVzdEF0dHJWYWx1ZXMuY3JlZGVudGlhbHMgfHwgaHRteC5jb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgdGltZW91dDogZXRjLnRpbWVvdXQgfHwgcmVxdWVzdEF0dHJWYWx1ZXMudGltZW91dCB8fCBodG14LmNvbmZpZy50aW1lb3V0LFxuICAgICAgcGF0aCxcbiAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZlbnRcbiAgICB9XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpZ1JlcXVlc3QnLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGNvcHkgb3V0IGluIGNhc2UgdGhlIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW5cbiAgICBwYXRoID0gcmVxdWVzdENvbmZpZy5wYXRoXG4gICAgdmVyYiA9IHJlcXVlc3RDb25maWcudmVyYlxuICAgIGhlYWRlcnMgPSByZXF1ZXN0Q29uZmlnLmhlYWRlcnNcbiAgICBmaWx0ZXJlZEZvcm1EYXRhID0gZm9ybURhdGFGcm9tT2JqZWN0KHJlcXVlc3RDb25maWcucGFyYW1ldGVycylcbiAgICBlcnJvcnMgPSByZXF1ZXN0Q29uZmlnLmVycm9yc1xuICAgIHVzZVVybFBhcmFtcyA9IHJlcXVlc3RDb25maWcudXNlVXJsUGFyYW1zXG5cbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXRQYXRoID0gcGF0aC5zcGxpdCgnIycpXG4gICAgY29uc3QgcGF0aE5vQW5jaG9yID0gc3BsaXRQYXRoWzBdXG4gICAgY29uc3QgYW5jaG9yID0gc3BsaXRQYXRoWzFdXG5cbiAgICBsZXQgZmluYWxQYXRoID0gcGF0aFxuICAgIGlmICh1c2VVcmxQYXJhbXMpIHtcbiAgICAgIGZpbmFsUGF0aCA9IHBhdGhOb0FuY2hvclxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gIWZpbHRlcmVkRm9ybURhdGEua2V5cygpLm5leHQoKS5kb25lXG4gICAgICBpZiAoaGFzVmFsdWVzKSB7XG4gICAgICAgIGlmIChmaW5hbFBhdGguaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyYnXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxQYXRoICs9IHVybEVuY29kZShmaWx0ZXJlZEZvcm1EYXRhKVxuICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcjJyArIGFuY2hvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2ZXJpZnlQYXRoKGVsdCwgZmluYWxQYXRoLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDppbnZhbGlkUGF0aCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICB4aHIub3Blbih2ZXJiLnRvVXBwZXJDYXNlKCksIGZpbmFsUGF0aCwgdHJ1ZSlcbiAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9odG1sJylcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdENvbmZpZy53aXRoQ3JlZGVudGlhbHNcbiAgICB4aHIudGltZW91dCA9IHJlcXVlc3RDb25maWcudGltZW91dFxuXG4gICAgLy8gcmVxdWVzdCBoZWFkZXJzXG4gICAgaWYgKHJlcXVlc3RBdHRyVmFsdWVzLm5vSGVhZGVycykge1xuICAgIC8vIGlnbm9yZSBhbGwgaGVhZGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgICAgIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7SHRteFJlc3BvbnNlSW5mb30gKi9cbiAgICBjb25zdCByZXNwb25zZUluZm8gPSB7XG4gICAgICB4aHIsXG4gICAgICB0YXJnZXQsXG4gICAgICByZXF1ZXN0Q29uZmlnLFxuICAgICAgZXRjLFxuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgc2VsZWN0LFxuICAgICAgcGF0aEluZm86IHtcbiAgICAgICAgcmVxdWVzdFBhdGg6IHBhdGgsXG4gICAgICAgIGZpbmFsUmVxdWVzdFBhdGg6IGZpbmFsUGF0aCxcbiAgICAgICAgcmVzcG9uc2VQYXRoOiBudWxsLFxuICAgICAgICBhbmNob3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBoaWVyYXJjaHlGb3JFbHQoZWx0KVxuICAgICAgICByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoID0gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpXG4gICAgICAgIHJlc3BvbnNlSGFuZGxlcihlbHQsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgaWYgKHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgIC8vIGlmIHRoZSBib2R5IG5vIGxvbmdlciBjb250YWlucyB0aGUgZWxlbWVudCwgdHJpZ2dlciB0aGUgZXZlbnQgb24gdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgICAgIC8vIHJlbWFpbmluZyBpbiB0aGUgRE9NXG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBsZXQgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IG51bGxcbiAgICAgICAgICB3aGlsZSAoaGllcmFyY2h5Lmxlbmd0aCA+IDAgJiYgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbHRJbkhpZXJhcmNoeSA9IGhpZXJhcmNoeS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoYm9keUNvbnRhaW5zKHBhcmVudEVsdEluSGllcmFyY2h5KSkge1xuICAgICAgICAgICAgICBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gcGFyZW50RWx0SW5IaWVyYXJjaHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlY29uZGFyeVRyaWdnZXJFbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6b25Mb2FkRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEFib3J0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGltZW91dCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUmVxdWVzdCcsIHJlc3BvbnNlSW5mbykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgdmFyIGluZGljYXRvcnMgPSBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpXG4gICAgdmFyIGRpc2FibGVFbHRzID0gZGlzYWJsZUVsZW1lbnRzKGVsdClcblxuICAgIGZvckVhY2goWydsb2Fkc3RhcnQnLCAnbG9hZGVuZCcsICdwcm9ncmVzcycsICdhYm9ydCddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgIGZvckVhY2goW3hociwgeGhyLnVwbG9hZF0sIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6eGhyOicgKyBldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IGV2ZW50Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlU2VuZCcsIHJlc3BvbnNlSW5mbylcbiAgICBjb25zdCBwYXJhbXMgPSB1c2VVcmxQYXJhbXMgPyBudWxsIDogZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRGb3JtRGF0YSlcbiAgICB4aHIuc2VuZChwYXJhbXMpXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeVVwZGF0ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdHlwZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3BhdGhdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKiBAcmV0dXJuIHtIdG14SGlzdG9yeVVwZGF0ZX1cbiAgICovXG4gIGZ1bmN0aW9uIGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEZpcnN0IGNvbnN1bHQgcmVzcG9uc2UgaGVhZGVyc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgcGF0aEZyb21IZWFkZXJzID0gbnVsbFxuICAgIGxldCB0eXBlRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2gtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXBsYWNlLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVwbGFjZS1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3JlcGxhY2UnXG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgd2FzIGEgcmVzcG9uc2UgaGVhZGVyLCB0aGF0IGhhcyBwcmlvcml0eVxuICAgIGlmIChwYXRoRnJvbUhlYWRlcnMpIHtcbiAgICAgIGlmIChwYXRoRnJvbUhlYWRlcnMgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHR5cGVGcm9tSGVhZGVycyxcbiAgICAgICAgICBwYXRoOiBwYXRoRnJvbUhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBOZXh0IHJlc29sdmUgdmlhIERPTSB2YWx1ZXNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8uZmluYWxSZXF1ZXN0UGF0aFxuICAgIGNvbnN0IHJlc3BvbnNlUGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGhcblxuICAgIGNvbnN0IHB1c2hVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHVzaC11cmwnKVxuICAgIGNvbnN0IHJlcGxhY2VVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcmVwbGFjZS11cmwnKVxuICAgIGNvbnN0IGVsZW1lbnRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgc2F2ZVR5cGUgPSBudWxsXG4gICAgbGV0IHBhdGggPSBudWxsXG5cbiAgICBpZiAocHVzaFVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSBwdXNoVXJsXG4gICAgfSBlbHNlIGlmIChyZXBsYWNlVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdyZXBsYWNlJ1xuICAgICAgcGF0aCA9IHJlcGxhY2VVcmxcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRJc0Jvb3N0ZWQpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgIH1cblxuICAgIGlmIChwYXRoKSB7XG4gICAgLy8gZmFsc2UgaW5kaWNhdGVzIG5vIHB1c2gsIHJldHVybiBlbXB0eSBvYmplY3RcbiAgICAgIGlmIChwYXRoID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyB0cnVlIGluZGljYXRlcyB3ZSB3YW50IHRvIGZvbGxvdyB3aGVyZXZlciB0aGUgc2VydmVyIGVuZGVkIHVwIHNlbmRpbmcgdXNcbiAgICAgIGlmIChwYXRoID09PSAndHJ1ZScpIHtcbiAgICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICAgIH1cblxuICAgICAgLy8gcmVzdG9yZSBhbnkgYW5jaG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdFxuICAgICAgaWYgKHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IgJiYgcGF0aC5pbmRleE9mKCcjJykgPT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoICsgJyMnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBzYXZlVHlwZSxcbiAgICAgICAgcGF0aFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ30gcmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nQ29uZmlnLCBzdGF0dXMpIHtcbiAgICB2YXIgcmVnRXhwID0gbmV3IFJlZ0V4cChyZXNwb25zZUhhbmRsaW5nQ29uZmlnLmNvZGUpXG4gICAgcmV0dXJuIHJlZ0V4cC50ZXN0KHN0YXR1cy50b1N0cmluZygxMCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWcgKi9cbiAgICAgIHZhciByZXNwb25zZUhhbmRsaW5nRWxlbWVudCA9IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmdbaV1cbiAgICAgIGlmIChjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nRWxlbWVudCwgeGhyLnN0YXR1cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vIG1hdGNoZXMsIHJldHVybiBubyBzd2FwXG4gICAgcmV0dXJuIHtcbiAgICAgIHN3YXA6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVGl0bGUodGl0bGUpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlRWx0ID0gZmluZCgndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWx0KSB7XG4gICAgICAgIHRpdGxlRWx0LmlubmVySFRNTCA9IHRpdGxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQWpheFJlc3BvbnNlKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuICAgIGxldCB0YXJnZXQgPSByZXNwb25zZUluZm8udGFyZ2V0XG4gICAgY29uc3QgZXRjID0gcmVzcG9uc2VJbmZvLmV0Y1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mb1NlbGVjdCA9IHJlc3BvbnNlSW5mby5zZWxlY3RcblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlT25Mb2FkJywgcmVzcG9uc2VJbmZvKSkgcmV0dXJuXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXI6L2kpKSB7XG4gICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXInLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1Mb2NhdGlvbjovaSkpIHtcbiAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICBsZXQgcmVkaXJlY3RQYXRoID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1Mb2NhdGlvbicpXG4gICAgICAvKiogQHR5cGUge0h0bXhBamF4SGVscGVyQ29udGV4dCZ7cGF0aDpzdHJpbmd9fSAqL1xuICAgICAgdmFyIHJlZGlyZWN0U3dhcFNwZWNcbiAgICAgIGlmIChyZWRpcmVjdFBhdGguaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICAgIHJlZGlyZWN0U3dhcFNwZWMgPSBwYXJzZUpTT04ocmVkaXJlY3RQYXRoKVxuICAgICAgICAvLyB3aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSB1c2VyIGRpZG4ndCBpbmNsdWRlIHRoaXNcbiAgICAgICAgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICAgIGRlbGV0ZSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgIH1cbiAgICAgIGFqYXhIZWxwZXIoJ2dldCcsIHJlZGlyZWN0UGF0aCwgcmVkaXJlY3RTd2FwU3BlYykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KHJlZGlyZWN0UGF0aClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSZWZyZXNoID0gaGFzSGVhZGVyKHhociwgL0hYLVJlZnJlc2g6L2kpICYmIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVmcmVzaCcpID09PSAndHJ1ZSdcblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVkaXJlY3Q6L2kpKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5ocmVmID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWRpcmVjdCcpXG4gICAgICBzaG91bGRSZWZyZXNoICYmIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVmcmVzaCkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXN0b3J5VXBkYXRlID0gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pXG5cbiAgICBjb25zdCByZXNwb25zZUhhbmRsaW5nID0gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKVxuICAgIGNvbnN0IHNob3VsZFN3YXAgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBcbiAgICBsZXQgaXNFcnJvciA9ICEhcmVzcG9uc2VIYW5kbGluZy5lcnJvclxuICAgIGxldCBpZ25vcmVUaXRsZSA9IGh0bXguY29uZmlnLmlnbm9yZVRpdGxlIHx8IHJlc3BvbnNlSGFuZGxpbmcuaWdub3JlVGl0bGVcbiAgICBsZXQgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnNlbGVjdFxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLnRhcmdldCkge1xuICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgcmVzcG9uc2VIYW5kbGluZy50YXJnZXQpKVxuICAgIH1cbiAgICB2YXIgc3dhcE92ZXJyaWRlID0gZXRjLnN3YXBPdmVycmlkZVxuICAgIGlmIChzd2FwT3ZlcnJpZGUgPT0gbnVsbCAmJiByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGVcbiAgICB9XG5cbiAgICAvLyByZXNwb25zZSBoZWFkZXJzIG92ZXJyaWRlIHJlc3BvbnNlIGhhbmRsaW5nIGNvbmZpZ1xuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgfVxuXG4gICAgdmFyIHNlcnZlclJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG4gICAgLyoqIEB0eXBlIEh0bXhCZWZvcmVTd2FwRGV0YWlscyAqL1xuICAgIHZhciBiZWZvcmVTd2FwRGV0YWlscyA9IG1lcmdlT2JqZWN0cyh7XG4gICAgICBzaG91bGRTd2FwLFxuICAgICAgc2VydmVyUmVzcG9uc2UsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaWdub3JlVGl0bGUsXG4gICAgICBzZWxlY3RPdmVycmlkZVxuICAgIH0sIHJlc3BvbnNlSW5mbylcblxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLmV2ZW50ICYmICF0cmlnZ2VyRXZlbnQodGFyZ2V0LCByZXNwb25zZUhhbmRsaW5nLmV2ZW50LCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpiZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICBzZXJ2ZXJSZXNwb25zZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlcnZlclJlc3BvbnNlIC8vIGFsbG93IHVwZGF0aW5nIGNvbnRlbnRcbiAgICBpc0Vycm9yID0gYmVmb3JlU3dhcERldGFpbHMuaXNFcnJvciAvLyBhbGxvdyB1cGRhdGluZyBlcnJvclxuICAgIGlnbm9yZVRpdGxlID0gYmVmb3JlU3dhcERldGFpbHMuaWdub3JlVGl0bGUgLy8gYWxsb3cgdXBkYXRpbmcgaWdub3JpbmcgdGl0bGVcbiAgICBzZWxlY3RPdmVycmlkZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlbGVjdE92ZXJyaWRlIC8vIGFsbG93IHVwZGF0aW5nIHNlbGVjdCBvdmVycmlkZVxuXG4gICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IHRhcmdldCAvLyBNYWtlIHVwZGF0ZWQgdGFyZ2V0IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uZmFpbGVkID0gaXNFcnJvciAvLyBNYWtlIGZhaWxlZCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLnN1Y2Nlc3NmdWwgPSAhaXNFcnJvciAvLyBNYWtlIHN1Y2Nlc3NmdWwgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuXG4gICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyODYpIHtcbiAgICAgICAgY2FuY2VsUG9sbGluZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICAgIHNlcnZlclJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHNlcnZlclJlc3BvbnNlLCB4aHIsIGVsdClcbiAgICAgIH0pXG5cbiAgICAgIC8vIFNhdmUgY3VycmVudCBwYWdlIGlmIHRoZXJlIHdpbGwgYmUgYSBoaXN0b3J5IHVwZGF0ZVxuICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgICAgfVxuICAgICAgdmFyIHN3YXBTcGVjID0gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwT3ZlcnJpZGUpXG5cbiAgICAgIGlmICghc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ2lnbm9yZVRpdGxlJykpIHtcbiAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSBpZ25vcmVUaXRsZVxuICAgICAgfVxuXG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuXG4gICAgICAvLyBvcHRpb25hbCB0cmFuc2l0aW9uIEFQSSBwcm9taXNlIGNhbGxiYWNrc1xuICAgICAgbGV0IHNldHRsZVJlc29sdmUgPSBudWxsXG4gICAgICBsZXQgc2V0dGxlUmVqZWN0ID0gbnVsbFxuXG4gICAgICBpZiAocmVzcG9uc2VJbmZvU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VJbmZvU2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzZWxlY3Q6L2kpKSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXNlbGVjdCcpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbGVjdE9PQiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3Qtb29iJylcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3QnKVxuXG4gICAgICBsZXQgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYgd2UgbmVlZCB0byBzYXZlIGhpc3RvcnksIGRvIHNvLCBiZWZvcmUgc3dhcHBpbmcgc28gdGhhdCByZWxhdGl2ZSByZXNvdXJjZXMgaGF2ZSB0aGUgY29ycmVjdCBiYXNlIFVSTFxuICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlVcGRhdGUnLCBtZXJnZU9iamVjdHMoeyBoaXN0b3J5OiBoaXN0b3J5VXBkYXRlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlID09PSAncHVzaCcpIHtcbiAgICAgICAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cHVzaGVkSW50b0hpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVwbGFjZVVybEluSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnJlcGxhY2VkSW5IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2FwKHRhcmdldCwgc2VydmVyUmVzcG9uc2UsIHN3YXBTcGVjLCB7XG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdE92ZXJyaWRlIHx8IHNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdE9PQixcbiAgICAgICAgICAgIGV2ZW50SW5mbzogcmVzcG9uc2VJbmZvLFxuICAgICAgICAgICAgYW5jaG9yOiByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yLFxuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQ6IGVsdCxcbiAgICAgICAgICAgIGFmdGVyU3dhcENhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVN3YXA6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVN3YXAnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFmdGVyU2V0dGxlQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1TZXR0bGUnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVzb2x2ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzd2FwRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlamVjdClcbiAgICAgICAgICB0aHJvdyBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNob3VsZFRyYW5zaXRpb24gPSBodG14LmNvbmZpZy5nbG9iYWxWaWV3VHJhbnNpdGlvbnNcbiAgICAgIGlmIChzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgndHJhbnNpdGlvbicpKSB7XG4gICAgICAgIHNob3VsZFRyYW5zaXRpb24gPSBzd2FwU3BlYy50cmFuc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFuc2l0aW9uICYmXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVRyYW5zaXRpb24nLCByZXNwb25zZUluZm8pICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNldHRsZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICAgIHNldHRsZVJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICAgIHNldHRsZVJlamVjdCA9IF9yZWplY3RcbiAgICAgICAgfSlcbiAgICAgICAgLy8gd3JhcCB0aGUgb3JpZ2luYWwgZG9Td2FwKCkgaW4gYSBjYWxsIHRvIHN0YXJ0Vmlld1RyYW5zaXRpb24oKVxuICAgICAgICBjb25zdCBpbm5lckRvU3dhcCA9IGRvU3dhcFxuICAgICAgICBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbm5lckRvU3dhcCgpXG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlUHJvbWlzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN3YXBTcGVjLnN3YXBEZWxheSA+IDApIHtcbiAgICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1N3YXAsIHN3YXBTcGVjLnN3YXBEZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU3dhcCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnJlc3BvbnNlRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogJ1Jlc3BvbnNlIFN0YXR1cyBFcnJvciBDb2RlICcgKyB4aHIuc3RhdHVzICsgJyBmcm9tICcgKyByZXNwb25zZUluZm8ucGF0aEluZm8ucmVxdWVzdFBhdGggfSwgcmVzcG9uc2VJbmZvKSlcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFeHRlbnNpb25zIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgSHRteEV4dGVuc2lvbj59ICovXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSB7fVxuXG4gIC8qKlxuICAgKiBleHRlbnNpb25CYXNlIGRlZmluZXMgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGZvciBhbGwgZXh0ZW5zaW9ucy5cbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb259XG4gICAqL1xuICBmdW5jdGlvbiBleHRlbnNpb25CYXNlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0OiBmdW5jdGlvbihhcGkpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBvbkV2ZW50OiBmdW5jdGlvbihuYW1lLCBldnQpIHsgcmV0dXJuIHRydWUgfSxcbiAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbih0ZXh0LCB4aHIsIGVsdCkgeyByZXR1cm4gdGV4dCB9LFxuICAgICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUpIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbih4aHIsIHBhcmFtZXRlcnMsIGVsdCkgeyByZXR1cm4gbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRlZmluZUV4dGVuc2lvbiBpbml0aWFsaXplcyB0aGUgZXh0ZW5zaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2RlZmluZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9ufSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbiBkZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiBkZWZpbmVFeHRlbnNpb24obmFtZSwgZXh0ZW5zaW9uKSB7XG4gICAgaWYgKGV4dGVuc2lvbi5pbml0KSB7XG4gICAgICBleHRlbnNpb24uaW5pdChpbnRlcm5hbEFQSSlcbiAgICB9XG4gICAgZXh0ZW5zaW9uc1tuYW1lXSA9IG1lcmdlT2JqZWN0cyhleHRlbnNpb25CYXNlKCksIGV4dGVuc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmVFeHRlbnNpb24gcmVtb3ZlcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgZGVsZXRlIGV4dGVuc2lvbnNbbmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRFeHRlbnNpb25zIHNlYXJjaGVzIHVwIHRoZSBET00gdHJlZSB0byByZXR1cm4gYWxsIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9uW109fSBleHRlbnNpb25zVG9SZXR1cm5cbiAgICogQHBhcmFtIHtzdHJpbmdbXT19IGV4dGVuc2lvbnNUb0lnbm9yZVxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucyhlbHQsIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKSB7XG4gICAgaWYgKGV4dGVuc2lvbnNUb1JldHVybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb1JldHVybiA9IFtdXG4gICAgfVxuICAgIGlmIChlbHQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAgfVxuICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9JZ25vcmUgPSBbXVxuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zRm9yRWxlbWVudCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWV4dCcpXG4gICAgaWYgKGV4dGVuc2lvbnNGb3JFbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGV4dGVuc2lvbnNGb3JFbGVtZW50LnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV4dGVuc2lvbk5hbWUpIHtcbiAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWUucmVwbGFjZSgvIC9nLCAnJylcbiAgICAgICAgaWYgKGV4dGVuc2lvbk5hbWUuc2xpY2UoMCwgNykgPT0gJ2lnbm9yZTonKSB7XG4gICAgICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlLnB1c2goZXh0ZW5zaW9uTmFtZS5zbGljZSg3KSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlLmluZGV4T2YoZXh0ZW5zaW9uTmFtZSkgPCAwKSB7XG4gICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXVxuICAgICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uc1RvUmV0dXJuLmluZGV4T2YoZXh0ZW5zaW9uKSA8IDApIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnNUb1JldHVybi5wdXNoKGV4dGVuc2lvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBnZXRFeHRlbnNpb25zKGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbGl6YXRpb25cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlzUmVhZHkgPSBmYWxzZVxuICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBpc1JlYWR5ID0gdHJ1ZVxuICB9KVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gbm93IGlmIERPTUNvbnRlbnRMb2FkZWQgaGFzIGZpcmVkLCBvdGhlcndpc2UgbGlzdGVuIGZvciBpdC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGlzUmVhZHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gYXNrIHRoZSBicm93c2VyIHdoZXRoZXJcbiAgICogdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBmaXJlZDsgdGhlcmUncyBhIGdhcCBiZXR3ZWVuIERPTUNvbnRlbnRMb2FkZWRcbiAgICogZmlyaW5nIGFuZCByZWFkeXN0YXRlPWNvbXBsZXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICAvLyBDaGVja2luZyByZWFkeVN0YXRlIGhlcmUgaXMgYSBmYWlsc2FmZSBpbiBjYXNlIHRoZSBodG14IHNjcmlwdCB0YWcgZW50ZXJlZCB0aGUgRE9NIGJ5XG4gICAgLy8gc29tZSBtZWFucyBvdGhlciB0aGFuIHRoZSBpbml0aWFsIHBhZ2UgbG9hZC5cbiAgICBpZiAoaXNSZWFkeSB8fCBnZXREb2N1bWVudCgpLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGZuKClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKCkge1xuICAgIGlmIChodG14LmNvbmZpZy5pbmNsdWRlSW5kaWNhdG9yU3R5bGVzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3Qgbm9uY2VBdHRyaWJ1dGUgPSBodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlID8gYCBub25jZT1cIiR7aHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZX1cImAgOiAnJ1xuICAgICAgZ2V0RG9jdW1lbnQoKS5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxcbiAgICAgICAgJzxzdHlsZScgKyBub25jZUF0dHJpYnV0ZSArICc+XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MH1cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICA8L3N0eWxlPicpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWV0YUNvbmZpZygpIHtcbiAgICAvKiogQHR5cGUgSFRNTE1ldGFFbGVtZW50ICovXG4gICAgY29uc3QgZWxlbWVudCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiaHRteC1jb25maWdcIl0nKVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gcGFyc2VKU09OKGVsZW1lbnQuY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZU1ldGFDb25maWcoKSB7XG4gICAgY29uc3QgbWV0YUNvbmZpZyA9IGdldE1ldGFDb25maWcoKVxuICAgIGlmIChtZXRhQ29uZmlnKSB7XG4gICAgICBodG14LmNvbmZpZyA9IG1lcmdlT2JqZWN0cyhodG14LmNvbmZpZywgbWV0YUNvbmZpZylcbiAgICB9XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBkb2N1bWVudFxuICByZWFkeShmdW5jdGlvbigpIHtcbiAgICBtZXJnZU1ldGFDb25maWcoKVxuICAgIGluc2VydEluZGljYXRvclN0eWxlcygpXG4gICAgbGV0IGJvZHkgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICBwcm9jZXNzTm9kZShib2R5KVxuICAgIGNvbnN0IHJlc3RvcmVkRWx0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiW2h4LXRyaWdnZXI9J3Jlc3RvcmVkJ10sW2RhdGEtaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXVwiXG4gICAgKVxuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphYm9ydCcsIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldFxuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHRhcmdldClcbiAgICAgIGlmIChpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnhocikge1xuICAgICAgICBpbnRlcm5hbERhdGEueGhyLmFib3J0KClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgY29uc3Qgb3JpZ2luYWxQb3BzdGF0ZSA9IHdpbmRvdy5vbnBvcHN0YXRlID8gd2luZG93Lm9ucG9wc3RhdGUuYmluZCh3aW5kb3cpIDogbnVsbFxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnN0YXRlICYmIGV2ZW50LnN0YXRlLmh0bXgpIHtcbiAgICAgICAgcmVzdG9yZUhpc3RvcnkoKVxuICAgICAgICBmb3JFYWNoKHJlc3RvcmVkRWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cmVzdG9yZWQnLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZ2V0RG9jdW1lbnQoKSxcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JpZ2luYWxQb3BzdGF0ZSkge1xuICAgICAgICAgIG9yaWdpbmFsUG9wc3RhdGUoZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHRyaWdnZXJFdmVudChib2R5LCAnaHRteDpsb2FkJywge30pIC8vIGdpdmUgcmVhZHkgaGFuZGxlcnMgYSBjaGFuY2UgdG8gbG9hZCB1cCBiZWZvcmUgZmlyaW5nIHRoaXMgZXZlbnRcbiAgICAgIGJvZHkgPSBudWxsIC8vIGtpbGwgcmVmZXJlbmNlIGZvciBnY1xuICAgIH0sIDApXG4gIH0pXG5cbiAgcmV0dXJuIGh0bXhcbn0pKClcblxuLyoqIEB0eXBlZGVmIHsnZ2V0J3wnaGVhZCd8J3Bvc3QnfCdwdXQnfCdkZWxldGUnfCdjb25uZWN0J3wnb3B0aW9ucyd8J3RyYWNlJ3wncGF0Y2gnfSBIdHRwVmVyYiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3YXBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0T09CXVxuICogQHByb3BlcnR5IHsqfSBbZXZlbnRJbmZvXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthbmNob3JdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFtjb250ZXh0RWxlbWVudF1cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTd2FwQ2FsbGJhY2tdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU2V0dGxlQ2FsbGJhY2tdXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgc3dhcENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J2lubmVySFRNTCcgfCAnb3V0ZXJIVE1MJyB8ICdiZWZvcmViZWdpbicgfCAnYWZ0ZXJiZWdpbicgfCAnYmVmb3JlZW5kJyB8ICdhZnRlcmVuZCcgfCAnZGVsZXRlJyB8ICdub25lJyB8IHN0cmluZ30gSHRteFN3YXBTdHlsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSHRteFN3YXBTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3YXBEZWxheVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNldHRsZURlbGF5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmFuc2l0aW9uXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hlYWRdXG4gKiBAcHJvcGVydHkgeyd0b3AnIHwgJ2JvdHRvbSd9IFtzY3JvbGxdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Njcm9sbFRhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd1RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzU2Nyb2xsXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygodGhpczpOb2RlLCBldnQ6RXZlbnQpID0+IGJvb2xlYW4pICYge3NvdXJjZTogc3RyaW5nfX0gQ29uZGl0aW9uYWxGdW5jdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxdXG4gKiBAcHJvcGVydHkge0NvbmRpdGlvbmFsRnVuY3Rpb259IFtldmVudEZpbHRlcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NoYW5nZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvbmNlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc3VtZV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb21dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyb3R0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3F1ZXVlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb290XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aHJlc2hvbGRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2VsdDogRWxlbWVudCwgbWVzc2FnZTogc3RyaW5nLCB2YWxpZGl0eTogVmFsaWRpdHlTdGF0ZX19IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gSHRteEhlYWRlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBIWC1SZXF1ZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyLU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRhcmdldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhYLUN1cnJlbnQtVVJMXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0hYLVByb21wdF1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtQm9vc3RlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQ29udGVudC1UeXBlXVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdF1cbiAqL1xuXG4vKiogQHR5cGVkZWYgSHRteEFqYXhIZWxwZXJDb250ZXh0XG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbc291cmNlXVxuICogQHByb3BlcnR5IHtFdmVudH0gW2V2ZW50XVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VVcmxQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGFyYW1ldGVycyBmb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gdW5maWx0ZXJlZEZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gdW5maWx0ZXJlZFBhcmFtZXRlcnMgdW5maWx0ZXJlZEZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufSBoZWFkZXJzXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdHRwVmVyYn0gdmVyYlxuICogQHByb3BlcnR5IHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2l0aENyZWRlbnRpYWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IHRyaWdnZXJpbmdFdmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSW5mb1xuICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtIdG14QWpheEV0Y30gZXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7e3JlcXVlc3RQYXRoOiBzdHJpbmcsIGZpbmFsUmVxdWVzdFBhdGg6IHN0cmluZywgcmVzcG9uc2VQYXRoOiBzdHJpbmd8bnVsbCwgYW5jaG9yOiBzdHJpbmd9fSBwYXRoSW5mb1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbGVkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc3VjY2Vzc2Z1bF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2tlZXBJbmRpY2F0b3JzXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEFqYXhFdGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JldHVyblByb21pc2VdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW3RhcmdldE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvZGVdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN3YXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V2ZW50XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0h0bXhSZXNwb25zZUluZm8gJiB7c2hvdWxkU3dhcDogYm9vbGVhbiwgc2VydmVyUmVzcG9uc2U6IGFueSwgaXNFcnJvcjogYm9vbGVhbiwgaWdub3JlVGl0bGU6IGJvb2xlYW4sIHNlbGVjdE92ZXJyaWRlOnN0cmluZ319IEh0bXhCZWZvcmVTd2FwRGV0YWlsc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEh0bXhBamF4SGFuZGxlclxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCgpID0+IHZvaWQpfSBIdG14U2V0dGxlVGFza1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFNldHRsZUluZm9cbiAqIEBwcm9wZXJ0eSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudFtdfSBlbHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RpdGxlXVxuICovXG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC1leHRlbnNpb25zL2Jsb2IvbWFpbi9SRUFETUUubWRcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhFeHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7KGFwaTogYW55KSA9PiB2b2lkfSBpbml0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudHxDdXN0b21FdmVudCkgPT4gYm9vbGVhbn0gb25FdmVudFxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nLCB4aHI6IFhNTEh0dHBSZXF1ZXN0LCBlbHQ6IEVsZW1lbnQpID0+IHN0cmluZ30gdHJhbnNmb3JtUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSkgPT4gYm9vbGVhbn0gaXNJbmxpbmVTd2FwXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsIHRhcmdldDogTm9kZSwgZnJhZ21lbnQ6IE5vZGUsIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvKSA9PiBib29sZWFufE5vZGVbXX0gaGFuZGxlU3dhcFxuICogQHByb3BlcnR5IHsoeGhyOiBYTUxIdHRwUmVxdWVzdCwgcGFyYW1ldGVyczogRm9ybURhdGEsIGVsdDogTm9kZSkgPT4gKnxzdHJpbmd8bnVsbH0gZW5jb2RlUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXXxudWxsfSBnZXRTZWxlY3RvcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaHRteFxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbihwYXRoU3BlYzogYW55LCB1cmw6IHN0cmluZykge1xuICBpZiAocGF0aFNwZWMgPT09IFwiaWdub3JlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoU3BlYy5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHVybFBhdGggPSB1cmwuc3BsaXQoXCIvXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHVybFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5RWxlbWVudCA9IGRlcGVuZGVuY3lQYXRoLnNoaWZ0KCk7XG4gICAgY29uc3QgcGF0aEVsZW1lbnQgPSB1cmxQYXRoW2ldO1xuICAgIGlmIChkZXBlbmRlbmN5RWxlbWVudCAhPT0gcGF0aEVsZW1lbnQgJiYgZGVwZW5kZW5jeUVsZW1lbnQgIT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMSAmJiBkZXBlbmRlbmN5UGF0aFswXSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hQYXRoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBlbHRzV2l0aERlcHMgPSBodG14LmZpbmRBbGwoXCJbcGF0aC1kZXBzXVwiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHRzV2l0aERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbHQgPSBlbHRzV2l0aERlcHNbaV07XG4gICAgaWYgKGRlcGVuZHNPbihlbHQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpLCBwYXRoKSkge1xuICAgICAgaHRteC50cmlnZ2VyKGVsdCwgXCJwYXRoLWRlcHNcIiwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicGF0aC1kZXBzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YmVmb3JlT25Mb2FkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZztcbiAgICAgIC8vIG11dGF0aW5nIGNhbGxcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnICYmXG4gICAgICAgIGNvbmZpZy52ZXJiICE9PSBcImdldFwiICYmXG4gICAgICAgIGV2dC50YXJnZXQgIT0gbnVsbCAmJlxuICAgICAgICBldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICBldnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSAhPT0gXCJpZ25vcmVcIlxuICAgICAgKSB7XG4gICAgICAgIHJlZnJlc2hQYXRoKGNvbmZpZy5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14LCB7IEh0bXhTZXR0bGVJbmZvLCBIdG14U3dhcFN0eWxlIH0gZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwidHJpZ2dlci1jaGlsZHJlblwiLCB7XG4gIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZ0LmRldGFpbC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY2hpbGRyZW4pIHtcbiAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlLCBuYW1lLCBudWxsKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgaW5pdDogZnVuY3Rpb24gKGFwaTogYW55KTogdm9pZCB7fSxcbiAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uIChcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICBlbHQ6IEVsZW1lbnQsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH0sXG4gIGlzSW5saW5lU3dhcDogZnVuY3Rpb24gKHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgaGFuZGxlU3dhcDogZnVuY3Rpb24gKFxuICAgIHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSxcbiAgICB0YXJnZXQ6IE5vZGUsXG4gICAgZnJhZ21lbnQ6IE5vZGUsXG4gICAgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8sXG4gICk6IGJvb2xlYW4gfCBOb2RlW10ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24gKFxuICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgcGFyYW1ldGVyczogRm9ybURhdGEsXG4gICAgZWx0OiBOb2RlLFxuICApIHt9LFxuICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uICgpOiBzdHJpbmdbXSB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJkZWJ1Z1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKG5hbWUpO1xuICAgIH0gZWxzZSBpZiAoY29uc29sZSkge1xuICAgICAgY29uc29sZS5sb2coXCJERUJVRzpcIiwgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCB7Y3JlYXRlV2ViU29ja2V0Q2xpZW50fSBmcm9tIFwiLi4vdXRpbC93c1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn0iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9IC9fX2V2YWxfW0EtWmEtejAtOV0rXFwoXFwpL2dtXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiaHRtZ29cIiwge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgaWYobmFtZSA9PT0gXCJodG14OmJlZm9yZUNsZWFudXBFbGVtZW50XCIgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICB9XG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKVxuICAgICAgICAgICAgY29uc3QgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgICAgICBpZihlbGUgJiYgZWxlLnRhZ05hbWUgPT09IFwiU0NSSVBUXCIpIHtcbiAgICAgICAgICAgICAgICBlbGUucmVtb3ZlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuXG5mdW5jdGlvbiB3YXRjaFVybChjYWxsYmFjazogKG9sZFVybDogc3RyaW5nLCBuZXdVcmw6IHN0cmluZykgPT4gdm9pZCkge1xuICBsZXQgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBsYXN0VXJsKSB7XG4gICAgICBjYWxsYmFjayhsYXN0VXJsLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuICB9LCAxMDApO1xufVxuXG53YXRjaFVybCgoXywgbmV3VXJsKSA9PiB7XG4gIG9uVXJsQ2hhbmdlKG5ld1VybCk7XG59KTtcblxuZnVuY3Rpb24gb25VcmxDaGFuZ2UobmV3VXJsOiBzdHJpbmcpIHtcbiAgbGV0IHVybCA9IG5ldyBVUkwobmV3VXJsKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXJdXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtdHJpZ2dlclwiKTtcbiAgICBpZiAoIXRyaWdnZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gdHJpZ2dlcnMuc3BsaXQoXCIsIFwiKTtcbiAgICBpZiAoc3BsaXQuZmluZCgocykgPT4gcyA9PT0gXCJ1cmxcIikpIHtcbiAgICAgIGh0bXguc3dhcChlbGVtZW50LCBcInVybFwiLCB7XG4gICAgICAgIHN3YXBTdHlsZTogXCJvdXRlckhUTUxcIixcbiAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZXNdIG9mIHVybC5zZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgbGV0IGV2ZW50TmFtZSA9IFwicXM6XCIgKyBrZXk7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5pbmNsdWRlcyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0cmlnZ2VyaW5nXCIsIGV2ZW50TmFtZSk7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIGV2ZW50TmFtZSwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtbWF0Y2gtcXBdXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBlbC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIikpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5yZXBsYWNlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiwgXCJcIik7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KG1hdGNoKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgaHRteC5zd2FwKGVsLCBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgPz8gXCJcIiwge1xuICAgICAgICAgICAgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLFxuICAgICAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGFzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzTWF0Y2gpIHtcbiAgICAgIGxldCBkZWZhdWx0S2V5ID0gZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtZGVmYXVsdFwiKTtcbiAgICAgIGlmIChkZWZhdWx0S2V5KSB7XG4gICAgICAgIGh0bXguc3dhcChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiICsgZGVmYXVsdEtleSkgPz8gXCJcIixcbiAgICAgICAgICB7IHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIiwgc3dhcERlbGF5OiAwLCBzZXR0bGVEZWxheTogMCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy93cy50cyIsIi4uL2pzL2h0bWdvLnRzIl0sIm5hbWVzIjpbImh0bXgiLCJlbHQiLCJ0eXBlIiwidmVyYiIsInRhZyIsImdsb2JhbCIsInN0ciIsImludGVydmFsIiwibmFtZSIsInF1YWxpZmllZE5hbWUiLCJwYXJlbnQiLCJjb25kaXRpb24iLCJpbml0aWFsRWxlbWVudCIsImFuY2VzdG9yIiwiYXR0cmlidXRlTmFtZSIsImF0dHJpYnV0ZVZhbHVlIiwiZGlzaW5oZXJpdCIsImluaGVyaXQiLCJjbG9zZXN0QXR0ciIsImUiLCJzZWxlY3RvciIsIm1hdGNoZXNGdW5jdGlvbiIsIm1hdGNoIiwicmVzcCIsImZyYWdtZW50Iiwic2NyaXB0IiwibmV3U2NyaXB0IiwiYXR0ciIsInJlc3BvbnNlIiwicmVzcG9uc2VXaXRoTm9IZWFkIiwic3RhcnRUYWciLCJkb2MiLCJ0aXRsZUVsZW1lbnQiLCJmdW5jIiwibyIsImRhdGFQcm9wIiwiZGF0YSIsImFyciIsInJldHVybkFyciIsImkiLCJlbCIsInJlY3QiLCJlbGVtVG9wIiwiZWxlbUJvdHRvbSIsInJvb3ROb2RlIiwidHJpZ2dlciIsIm9iajEiLCJvYmoyIiwia2V5IiwialN0cmluZyIsImVycm9yIiwidGVzdCIsInBhdGgiLCJ1cmwiLCJjYWxsYmFjayIsImV2dCIsImV2ZW50IiwiZWx0T3JTZWxlY3RvciIsImRlbGF5IiwidmFsdWUiLCJjbGF6eiIsIm5vZGUiLCJjaGlsZCIsInByZWZpeCIsInN1ZmZpeCIsInRyaW1tZWRTZWxlY3RvciIsInN0YXJ0IiwicmVzdWx0cyIsImNvbnRleHQiLCJhcmcxIiwiYXJnMiIsImFyZzMiLCJldmVudEFyZ3MiLCJhdHRyTmFtZSIsImF0dHJUYXJnZXQiLCJyZXN1bHQiLCJhdHRyaWJ1dGUiLCJ0YXJnZXRTdHIiLCJhdHRyaWJ1dGVzVG9TZXR0bGUiLCJtZXJnZVRvIiwibWVyZ2VGcm9tIiwic3dhcFN0eWxlIiwidGFyZ2V0IiwiZXh0ZW5zaW9ucyIsImV4dGVuc2lvbiIsIm9vYlZhbHVlIiwib29iRWxlbWVudCIsInNldHRsZUluZm8iLCJ0YXJnZXRzIiwib29iRWxlbWVudENsb25lIiwiYmVmb3JlU3dhcERldGFpbHMiLCJwcmVzZXJ2ZWRFbHQiLCJpZCIsIm9sZEVsdCIsInBhcmVudE5vZGUiLCJuZXdOb2RlIiwibm9ybWFsaXplZElkIiwibm9ybWFsaXplZFRhZyIsInBhcmVudEVsdCIsIm9sZE5vZGUiLCJuZXdBdHRyaWJ1dGVzIiwiYXV0b2ZvY3VzIiwiYXV0b0ZvY3VzZWRFbHQiLCJpbnNlcnRCZWZvcmUiLCJzdHJpbmciLCJoYXNoIiwiY2hhciIsImludGVybmFsRGF0YSIsImhhbmRsZXJJbmZvIiwiZWxlbWVudCIsImluZm8iLCJuZXdFbHQiLCJlbHRCZWZvcmVOZXdDb250ZW50IiwiZmlyc3RDaGlsZCIsImV4dCIsIm5ld0VsZW1lbnRzIiwiaiIsIm9vYkVsdHMiLCJjb250ZW50Iiwic3dhcFNwZWMiLCJzd2FwT3B0aW9ucyIsImFjdGl2ZUVsdCIsInNlbGVjdGlvbkluZm8iLCJvb2JTZWxlY3RWYWx1ZXMiLCJvb2JTZWxlY3RWYWx1ZSIsInRlbXBsYXRlIiwibmV3RnJhZ21lbnQiLCJuZXdBY3RpdmVFbHQiLCJmb2N1c09wdGlvbnMiLCJkb1NldHRsZSIsInRhc2siLCJhbmNob3JUYXJnZXQiLCJ4aHIiLCJoZWFkZXIiLCJ0cmlnZ2VyQm9keSIsInRyaWdnZXJzIiwiZXZlbnROYW1lIiwiZGV0YWlsIiwiZXZlbnROYW1lcyIsInRva2VucyIsInBvc2l0aW9uIiwic3RhcnRQb3NpdGlvbiIsInN0YXJ0Q2hhciIsInN5bWJvbCIsInRva2VuIiwibGFzdCIsInBhcmFtTmFtZSIsImJyYWNrZXRDb3VudCIsImNvbmRpdGlvbmFsU291cmNlIiwiY29uZGl0aW9uRnVuY3Rpb24iLCJleHBsaWNpdFRyaWdnZXIiLCJjYWNoZSIsInRyaWdnZXJTcGVjcyIsImluaXRpYWxMZW5ndGgiLCJldmVyeSIsImV2ZW50RmlsdGVyIiwidHJpZ2dlclNwZWMiLCJmcm9tX2FyZyIsImhhbmRsZXIiLCJzcGVjIiwibm9kZURhdGEiLCJyYXdBdHRyaWJ1dGUiLCJzb3VyY2UiLCJleHBsaWNpdENhbmNlbCIsImVsZW1lbnREYXRhIiwiZWx0c1RvTGlzdGVuT24iLCJlbHRUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbkRhdGEiLCJldmVudExpc3RlbmVyIiwiZXZlbnREYXRhIiwibG9hZCIsImV4cGxpY2l0QWN0aW9uIiwib2JzZXJ2ZXJPcHRpb25zIiwiZW50cmllcyIsImF0dHJpYnV0ZXMiLCJlbGVtZW50cyIsIml0ZXIiLCJib29zdGVkU2VsZWN0b3IiLCJleHRlbnNpb25TZWxlY3RvcnMiLCJzZWxlY3RvcnMiLCJzIiwiZm9ybSIsImNvZGUiLCJsaXN0ZW5lciIsImFmdGVyT25Qb3NpdGlvbiIsIm5leHRDaGFyIiwidG9EbyIsIm1zZyIsImV2ZW50UmVzdWx0Iiwia2ViYWJOYW1lIiwia2ViYWJlZEV2ZW50Iiwicm9vdEVsdCIsImlubmVySFRNTCIsInRpdGxlIiwic2Nyb2xsIiwiaGlzdG9yeUNhY2hlIiwibmV3SGlzdG9yeUl0ZW0iLCJjbGFzc05hbWUiLCJjbG9uZSIsImRpc2FibGVIaXN0b3J5Q2FjaGUiLCJ0YXNrcyIsInJlcXVlc3QiLCJkZXRhaWxzIiwiaGlzdG9yeUVsZW1lbnQiLCJjYWNoZWQiLCJpbmRpY2F0b3JzIiwiaWMiLCJkaXNhYmxlZEVsdHMiLCJkaXNhYmxlZEVsZW1lbnQiLCJkaXNhYmxlZCIsInByb2Nlc3NlZCIsImZvcm1EYXRhIiwidiIsInZhbHVlcyIsImVycm9ycyIsInZhbGlkYXRlIiwiaW5wdXQiLCJyZWNlaXZlciIsImRvbm9yIiwicHJpb3JpdHlGb3JtRGF0YSIsImJ1dHRvbiIsImluY2x1ZGVzIiwiZGVzY2VuZGFudCIsInJldHVyblN0ciIsInJlYWxWYWx1ZSIsInByb21wdCIsImhlYWRlcnMiLCJpbnB1dFZhbHVlcyIsInBhcmFtc1ZhbHVlIiwibmV3VmFsdWVzIiwic3dhcEluZm9PdmVycmlkZSIsInN3YXBJbmZvIiwic3BsaXQiLCJzcGxpdFNwZWMiLCJzY3JvbGxWYWwiLCJzZWxlY3RvclZhbCIsInNob3dWYWwiLCJmb2N1c1Njcm9sbFZhbCIsImZpbHRlcmVkUGFyYW1ldGVycyIsImVuY29kZWRQYXJhbWV0ZXJzIiwiZmlyc3QiLCJldmFsQXNEZWZhdWx0IiwiZXZhbHVhdGVWYWx1ZSIsInZhcnNWYWx1ZXMiLCJ0b0V2YWwiLCJkZWZhdWx0VmFsIiwiZXhwcmVzc2lvblZhcnMiLCJoZWFkZXJWYWx1ZSIsInJlZ2V4cCIsInJlcXVlc3RDb25maWciLCJzYW1lSG9zdCIsIm9iaiIsImFycmF5IiwiaW5kZXgiLCJwcm9wIiwiZXRjIiwiY29uZmlybWVkIiwicmVzb2x2ZSIsInJlamVjdCIsInByb21pc2UiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJyZXNwb25zZUhhbmRsZXIiLCJzZWxlY3QiLCJlbHREYXRhIiwic3VibWl0dGVyIiwiYnV0dG9uUGF0aCIsImJ1dHRvblZlcmIiLCJjb25maXJtUXVlc3Rpb24iLCJza2lwQ29uZmlybWF0aW9uIiwic3luY0VsdCIsInN5bmNTdHJhdGVneSIsInF1ZXVlU3RyYXRlZ3kiLCJhYm9ydGFibGUiLCJzeW5jU3RyaW5ncyIsImVuZFJlcXVlc3RMb2NrIiwicHJvbXB0UXVlc3Rpb24iLCJwcm9tcHRSZXNwb25zZSIsInJhd0Zvcm1EYXRhIiwiYWxsRm9ybURhdGEiLCJmaWx0ZXJlZEZvcm1EYXRhIiwicmVxdWVzdEF0dHJWYWx1ZXMiLCJlbHRJc0Jvb3N0ZWQiLCJ1c2VVcmxQYXJhbXMiLCJzcGxpdFBhdGgiLCJwYXRoTm9BbmNob3IiLCJhbmNob3IiLCJmaW5hbFBhdGgiLCJyZXNwb25zZUluZm8iLCJoaWVyYXJjaHkiLCJkaXNhYmxlRWx0cyIsInNlY29uZGFyeVRyaWdnZXJFbHQiLCJwYXJlbnRFbHRJbkhpZXJhcmNoeSIsInBhcmFtcyIsInBhdGhGcm9tSGVhZGVycyIsInR5cGVGcm9tSGVhZGVycyIsInJlcXVlc3RQYXRoIiwicmVzcG9uc2VQYXRoIiwicHVzaFVybCIsInJlcGxhY2VVcmwiLCJlbGVtZW50SXNCb29zdGVkIiwic2F2ZVR5cGUiLCJyZXNwb25zZUhhbmRsaW5nQ29uZmlnIiwic3RhdHVzIiwicmVnRXhwIiwicmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQiLCJ0aXRsZUVsdCIsInJlc3BvbnNlSW5mb1NlbGVjdCIsInJlZGlyZWN0UGF0aCIsInJlZGlyZWN0U3dhcFNwZWMiLCJzaG91bGRSZWZyZXNoIiwiaGlzdG9yeVVwZGF0ZSIsInJlc3BvbnNlSGFuZGxpbmciLCJzaG91bGRTd2FwIiwiaXNFcnJvciIsImlnbm9yZVRpdGxlIiwic2VsZWN0T3ZlcnJpZGUiLCJzd2FwT3ZlcnJpZGUiLCJzZXJ2ZXJSZXNwb25zZSIsInNldHRsZVJlc29sdmUiLCJzZXR0bGVSZWplY3QiLCJzZWxlY3RPT0IiLCJkb1N3YXAiLCJmaW5hbEVsdCIsInNob3VsZFRyYW5zaXRpb24iLCJzZXR0bGVQcm9taXNlIiwiaW5uZXJEb1N3YXAiLCJhcGkiLCJ0ZXh0IiwicGFyYW1ldGVycyIsImV4dGVuc2lvbnNUb1JldHVybiIsImV4dGVuc2lvbnNUb0lnbm9yZSIsImV4dGVuc2lvbnNGb3JFbGVtZW50IiwiZXh0ZW5zaW9uTmFtZSIsImZuIiwibm9uY2VBdHRyaWJ1dGUiLCJtZXRhQ29uZmlnIiwiYm9keSIsInJlc3RvcmVkRWx0cyIsIm9yaWdpbmFsUG9wc3RhdGUiLCJodG14X2VzbV9kZWZhdWx0IiwiZGVwZW5kc09uIiwicGF0aFNwZWMiLCJkZXBlbmRlbmN5UGF0aCIsInVybFBhdGgiLCJkZXBlbmRlbmN5RWxlbWVudCIsInBhdGhFbGVtZW50IiwicmVmcmVzaFBhdGgiLCJlbHRzV2l0aERlcHMiLCJjb25maWciLCJrZWJhYkV2ZW50TmFtZSIsIm1ha2VFdmVudCIsInRyaWdnZXJDaGlsZHJlbiIsInRyaWdnZXJlZCIsIm5ld0V2ZW50IiwiYXR0clByZWZpeCIsInN0YXJ0c1dpdGgiLCJnZXRSZXNwQ29kZVRhcmdldCIsInJlc3BDb2RlTnVtYmVyIiwicmVzcENvZGUiLCJhdHRyUG9zc2liaWxpdGllcyIsImF0dHJWYWx1ZSIsImhhbmRsZUVycm9yRmxhZyIsImFwaVJlZiIsImxhc3RWZXJzaW9uIiwiZW5hYmxlZCIsImV2ZW50U291cmNlIiwibWVzc2FnZSIsInJlbG9hZCIsImV2YWxGdW5jUmVnZXgiLCJyZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyIsIm1hdGNoZXMiLCJlbGUiLCJzcGxpdE9uV2hpdGVzcGFjZSIsImdldExlZ2FjeVdlYnNvY2tldFVSTCIsImxlZ2FjeVNTRVZhbHVlIiwiZW5zdXJlV2ViU29ja2V0Iiwic29ja2V0RWx0Iiwid3NzU291cmNlIiwibGVnYWN5U291cmNlIiwiYmFzZV9wYXJ0Iiwic29ja2V0V3JhcHBlciIsImNyZWF0ZVdlYnNvY2tldFdyYXBwZXIiLCJtYXliZUNsb3NlV2ViU29ja2V0U291cmNlIiwiY2hpbGRyZW4iLCJzb2NrZXRGdW5jIiwid3JhcHBlciIsInNlbmRFbHQiLCJxdWV1ZWRJdGVtIiwic29ja2V0IiwiZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkiLCJldmVudHMiLCJrIiwiZW5zdXJlV2ViU29ja2V0U2VuZCIsImxlZ2FjeUF0dHJpYnV0ZSIsIndlYlNvY2tldFBhcmVudCIsImhhc1dlYlNvY2tldCIsInByb2Nlc3NXZWJTb2NrZXRTZW5kIiwidHMiLCJyYXdQYXJhbWV0ZXJzIiwiYWxsUGFyYW1ldGVycyIsInNlbmRDb25maWciLCJ0b1NlbmQiLCJyZXRyeUNvdW50IiwiZXhwIiwiY3JlYXRlV2ViU29ja2V0Iiwic29jayIsInF1ZXJ5QXR0cmlidXRlT25UaGlzT3JDaGlsZHJlbiIsImZvckVhY2giLCJ3YXRjaFVybCIsImxhc3RVcmwiLCJfIiwibmV3VXJsIiwib25VcmxDaGFuZ2UiLCJoYXNNYXRjaCIsImRlZmF1bHRLZXkiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLEVBQUFBLENBQVEsVUFBVyxDQUlyQixJQUFNLElBQU8sQ0FBQSxDQUlYLE9BQVEsSUFFUixDQUFBLE9BQUEsQ0FBUyxLQUVULEVBQUksQ0FBQSxJQUFBLENBRUosSUFBSyxJQUVMLENBQUEsT0FBQSxDQUFTLEtBRVQsSUFBTSxDQUFBLElBQUEsQ0FHTixJQUFNLENBQUEsSUFBQSxDQUVOLE9BQVMsQ0FBQSxJQUFBLENBRVQsUUFBUyxJQVVULENBQUEsTUFBQSxDQUFRLFNBQVNDLENBQUtDLENBQUFBLENBQUFBLENBQU0sQ0FFMUIsT0FEb0IsY0FBQSxDQUFlRCxDQUFLQyxDQUFBQSxDQUFBQSxFQUFRLE1BQU0sQ0FBQSxDQUNuQyxNQUNyQixDQUdBLENBQUEsTUFBQSxDQUFRLEtBRVIsUUFBVSxDQUFBLElBQUEsQ0FFVixZQUFhLElBRWIsQ0FBQSxXQUFBLENBQWEsSUFFYixDQUFBLFNBQUEsQ0FBVyxJQUVYLENBQUEsSUFBQSxDQUFNLEtBR04sZUFBaUIsQ0FBQSxJQUFBLENBRWpCLGdCQUFpQixJQUdqQixDQUFBLE1BQUEsQ0FBUSxLQUVSLE9BQVMsQ0FBQSxJQUFBLENBT1QsTUFBUSxDQUFBLElBQUEsQ0FRUixNQUFRLENBQUEsQ0FNTixlQUFnQixDQU1oQixDQUFBLENBQUEsZ0JBQUEsQ0FBa0IsR0FLbEIsb0JBQXNCLENBQUEsQ0FBQSxDQUFBLENBTXRCLGlCQUFrQixXQU1sQixDQUFBLGdCQUFBLENBQWtCLENBTWxCLENBQUEsa0JBQUEsQ0FBb0IsRUFNcEIsQ0FBQSxzQkFBQSxDQUF3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Q0FDcEMsR0FBSWhDLENBQUssQ0FBQSxVQUFBLENBQVcsc0JBQXNCLENBQUcsQ0FBQSxDQUMzQyxJQUFJYyxDQUFBQSxDQUFRZCxDQUFLLENBQUEsT0FBQSxDQUFRLHVCQUF3QixFQUFFLENBQUEsQ0FFbkQsR0FEWTZDLENBQUksQ0FBQSxZQUFBLENBQWEsSUFBSS9CLENBQUssQ0FBQSxDQUMzQixDQUNUOFQsQ0FBQUEsQ0FBSyxJQUFLNVMsQ0FBQUEsQ0FBQUEsQ0FBSUEsRUFBRyxZQUFhaEMsQ0FBQUEsQ0FBSSxHQUFLLEVBQUksQ0FBQSxDQUN6QyxVQUFXLFdBQ1gsQ0FBQSxTQUFBLENBQVcsQ0FDWCxDQUFBLFdBQUEsQ0FBYSxDQUNmLENBQUMsRUFDRHNaLENBQVcsQ0FBQSxDQUFBLENBQUEsQ0FDWCxLQUNGLENBQ0YsQ0FFRixHQUFJLENBQUNBLENBQUFBLENBQVUsQ0FDYixJQUFJQyxDQUFhdlgsQ0FBQUEsQ0FBQUEsQ0FBRyxhQUFhLHFCQUFxQixDQUFBLENBQ2xEdVgsR0FDRjNFLENBQUssQ0FBQSxJQUFBLENBQ0g1UyxFQUNBQSxDQUFHLENBQUEsWUFBQSxDQUFhLHNCQUF5QnVYLENBQUFBLENBQVUsQ0FBSyxFQUFBLEVBQUEsQ0FDeEQsQ0FBRSxTQUFXLENBQUEsV0FBQSxDQUFhLFVBQVcsQ0FBRyxDQUFBLFdBQUEsQ0FBYSxDQUFFLENBQ3pELEVBRUosQ0FDRixDQUFDLEVBQ0giLCJmaWxlIjoiaHRtZ28uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaHRteCA9IChmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnXG5cbiAgLy8gUHVibGljIEFQSVxuICBjb25zdCBodG14ID0ge1xuICAgIC8vIFRzYyBtYWRuZXNzIGhlcmUsIGFzc2lnbmluZyB0aGUgZnVuY3Rpb25zIGRpcmVjdGx5IHJlc3VsdHMgaW4gYW4gaW52YWxpZCBUeXBlU2NyaXB0IG91dHB1dCwgYnV0IHJlYXNzaWduaW5nIGlzIGZpbmVcbiAgICAvKiBFdmVudCBwcm9jZXNzaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygb25Mb2FkSGVscGVyfSAqL1xuICAgIG9uTG9hZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwcm9jZXNzTm9kZX0gKi9cbiAgICBwcm9jZXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZEV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9mZjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0cmlnZ2VyRXZlbnR9ICovXG4gICAgdHJpZ2dlcjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhamF4SGVscGVyfSAqL1xuICAgIGFqYXg6IG51bGwsXG4gICAgLyogRE9NIHF1ZXJ5aW5nIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kfSAqL1xuICAgIGZpbmQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZEFsbH0gKi9cbiAgICBmaW5kQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGNsb3Nlc3R9ICovXG4gICAgY2xvc2VzdDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbnB1dCB2YWx1ZXMgdGhhdCB3b3VsZCByZXNvbHZlIGZvciBhIGdpdmVuIGVsZW1lbnQgdmlhIHRoZSBodG14IHZhbHVlIHJlc29sdXRpb24gbWVjaGFuaXNtXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN2YWx1ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0IHRoZSBlbGVtZW50IHRvIHJlc29sdmUgdmFsdWVzIG9uXG4gICAgICogQHBhcmFtIHtIdHRwVmVyYn0gdHlwZSB0aGUgcmVxdWVzdCB0eXBlIChlLmcuICoqZ2V0Kiogb3IgKipwb3N0KiopIG5vbi1HRVQncyB3aWxsIGluY2x1ZGUgdGhlIGVuY2xvc2luZyBmb3JtIG9mIHRoZSBlbGVtZW50LiBEZWZhdWx0cyB0byAqKnBvc3QqKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgdmFsdWVzOiBmdW5jdGlvbihlbHQsIHR5cGUpIHtcbiAgICAgIGNvbnN0IGlucHV0VmFsdWVzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB0eXBlIHx8ICdwb3N0JylcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlcy52YWx1ZXNcbiAgICB9LFxuICAgIC8qIERPTSBtYW5pcHVsYXRpb24gaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZENsYXNzVG9FbGVtZW50fSAqL1xuICAgIGFkZENsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdG9nZ2xlQ2xhc3NPbkVsZW1lbnR9ICovXG4gICAgdG9nZ2xlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdGFrZUNsYXNzRm9yRWxlbWVudH0gKi9cbiAgICB0YWtlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygc3dhcH0gKi9cbiAgICBzd2FwOiBudWxsLFxuICAgIC8qIEV4dGVuc2lvbiBlbnRyeXBvaW50cyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGRlZmluZUV4dGVuc2lvbn0gKi9cbiAgICBkZWZpbmVFeHRlbnNpb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXh0ZW5zaW9ufSAqL1xuICAgIHJlbW92ZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dBbGx9ICovXG4gICAgbG9nQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ05vbmV9ICovXG4gICAgbG9nTm9uZTogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKipcbiAgICAgKiBUaGUgbG9nZ2VyIGh0bXggdXNlcyB0byBsb2cgd2l0aFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nZ2VyXG4gICAgICovXG4gICAgbG9nZ2VyOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHkgaG9sZGluZyB0aGUgY29uZmlndXJhdGlvbiBodG14IHVzZXMgYXQgcnVudGltZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB1c2luZyBhIFttZXRhIHRhZ10oaHR0cHM6Ly9odG14Lm9yZy9kb2NzLyNjb25maWcpIGlzIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHRoZXNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjb25maWdcbiAgICAgKi9cbiAgICBjb25maWc6IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byB1c2UgaGlzdG9yeS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUVuYWJsZWQ6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8ga2VlcCBpbiAqKmxvY2FsU3RvcmFnZSoqIGZvciBoaXN0b3J5IHN1cHBvcnQuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlDYWNoZVNpemU6IDEwLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICByZWZyZXNoT25IaXN0b3J5TWlzczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IHN3YXAgc3R5bGUgdG8gdXNlIGlmICoqW2h4LXN3YXBdKGh0dHBzOi8vaHRteC5vcmcvYXR0cmlidXRlcy9oeC1zd2FwKSoqIGlzIG9taXR0ZWQuXG4gICAgICAgKiBAdHlwZSBIdG14U3dhcFN0eWxlXG4gICAgICAgKiBAZGVmYXVsdCAnaW5uZXJIVE1MJ1xuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcFN0eWxlOiAnaW5uZXJIVE1MJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiByZWNlaXZpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGRvaW5nIHRoZSBzd2FwLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwRGVsYXk6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gY29tcGxldGluZyB0aGUgY29udGVudCBzd2FwIGFuZCBzZXR0bGluZyBhdHRyaWJ1dGVzLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U2V0dGxlRGVsYXk6IDIwLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0cnVlLCBodG14IHdpbGwgaW5qZWN0IGEgc21hbGwgYW1vdW50IG9mIENTUyBpbnRvIHRoZSBwYWdlIHRvIG1ha2UgaW5kaWNhdG9ycyBpbnZpc2libGUgdW5sZXNzIHRoZSAqKmh0bXgtaW5kaWNhdG9yKiogY2xhc3MgaXMgcHJlc2VudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaW5jbHVkZUluZGljYXRvclN0eWxlczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIGluZGljYXRvcnMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1pbmRpY2F0b3InXG4gICAgICAgKi9cbiAgICAgIGluZGljYXRvckNsYXNzOiAnaHRteC1pbmRpY2F0b3InLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdHJpZ2dlcmluZyBlbGVtZW50cyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXJlcXVlc3QnXG4gICAgICAgKi9cbiAgICAgIHJlcXVlc3RDbGFzczogJ2h0bXgtcmVxdWVzdCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byB0ZW1wb3JhcmlseSBwbGFjZSBvbiBlbGVtZW50cyB0aGF0IGh0bXggaGFzIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWFkZGVkJ1xuICAgICAgICovXG4gICAgICBhZGRlZENsYXNzOiAnaHRteC1hZGRlZCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc2V0dGxpbmcnXG4gICAgICAgKi9cbiAgICAgIHNldHRsaW5nQ2xhc3M6ICdodG14LXNldHRsaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHN3YXBwaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zd2FwcGluZydcbiAgICAgICAqL1xuICAgICAgc3dhcHBpbmdDbGFzczogJ2h0bXgtc3dhcHBpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvd3MgdGhlIHVzZSBvZiBldmFsLWxpa2UgZnVuY3Rpb25hbGl0eSBpbiBodG14LCB0byBlbmFibGUgKipoeC12YXJzKiosIHRyaWdnZXIgY29uZGl0aW9ucyAmIHNjcmlwdCB0YWcgZXZhbHVhdGlvbi4gQ2FuIGJlIHNldCB0byAqKmZhbHNlKiogZm9yIENTUCBjb21wYXRpYmlsaXR5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd0V2YWw6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byBmYWxzZSwgZGlzYWJsZXMgdGhlIGludGVycHJldGF0aW9uIG9mIHNjcmlwdCB0YWdzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd1NjcmlwdFRhZ3M6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHNjcmlwdHMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVNjcmlwdE5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc3R5bGVzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTdHlsZU5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGF0dHJpYnV0ZXMgdG8gc2V0dGxlIGR1cmluZyB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgICAgICogQGRlZmF1bHQgWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXVxuICAgICAgICovXG4gICAgICBhdHRyaWJ1dGVzVG9TZXR0bGU6IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93IGNyb3NzLXNpdGUgQWNjZXNzLUNvbnRyb2wgcmVxdWVzdHMgdXNpbmcgY3JlZGVudGlhbHMgc3VjaCBhcyBjb29raWVzLCBhdXRob3JpemF0aW9uIGhlYWRlcnMgb3IgVExTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgdGltZW91dDogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgKipnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheSoqIGZvciByZWNvbm5lY3RpbmcgYWZ0ZXIgdW5leHBlY3RlZCBjb25uZWN0aW9uIGxvc3MgYnkgdGhlIGV2ZW50IGNvZGUgKipBYm5vcm1hbCBDbG9zdXJlKiosICoqU2VydmljZSBSZXN0YXJ0Kiogb3IgKipUcnkgQWdhaW4gTGF0ZXIqKi5cbiAgICAgICAqIEB0eXBlIHsnZnVsbC1qaXR0ZXInIHwgKChyZXRyeUNvdW50Om51bWJlcikgPT4gbnVtYmVyKX1cbiAgICAgICAqIEBkZWZhdWx0IFwiZnVsbC1qaXR0ZXJcIlxuICAgICAgICovXG4gICAgICB3c1JlY29ubmVjdERlbGF5OiAnZnVsbC1qaXR0ZXInLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdHlwZSBvZiBiaW5hcnkgZGF0YSBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICogQHR5cGUgQmluYXJ5VHlwZVxuICAgICAgICogQGRlZmF1bHQgJ2Jsb2InXG4gICAgICAgKi9cbiAgICAgIHdzQmluYXJ5VHlwZTogJ2Jsb2InLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJ1xuICAgICAgICovXG4gICAgICBkaXNhYmxlU2VsZWN0b3I6ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgeydhdXRvJyB8ICdpbnN0YW50JyB8ICdzbW9vdGgnfVxuICAgICAgICogQGRlZmF1bHQgJ2luc3RhbnQnXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoZSBmb2N1c2VkIGVsZW1lbnQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdmlldy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRGb2N1c1Njcm9sbDogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBpbmNsdWRlIGEgY2FjaGUtYnVzdGluZyBwYXJhbWV0ZXIgaW4gR0VUIHJlcXVlc3RzIHRvIGF2b2lkIGNhY2hpbmcgcGFydGlhbCByZXNwb25zZXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdldENhY2hlQnVzdGVyUGFyYW06IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgaHRteCB3aWxsIHVzZSB0aGUgVmlldyBUcmFuc2l0aW9uIEFQSSB3aGVuIHN3YXBwaW5nIGluIG5ldyBjb250ZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2xvYmFsVmlld1RyYW5zaXRpb25zOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogaHRteCB3aWxsIGZvcm1hdCByZXF1ZXN0cyB3aXRoIHRoZXNlIG1ldGhvZHMgYnkgZW5jb2RpbmcgdGhlaXIgcGFyYW1ldGVycyBpbiB0aGUgVVJMLCBub3QgdGhlIHJlcXVlc3QgYm9keVxuICAgICAgICogQHR5cGUgeyhIdHRwVmVyYilbXX1cbiAgICAgICAqIEBkZWZhdWx0IFsnZ2V0JywgJ2RlbGV0ZSddXG4gICAgICAgKi9cbiAgICAgIG1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zOiBbJ2dldCcsICdkZWxldGUnXSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGRpc2FibGVzIGh0bXgtYmFzZWQgcmVxdWVzdHMgdG8gbm9uLW9yaWdpbiBob3N0cy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHNlbGZSZXF1ZXN0c09ubHk6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBub3QgdXBkYXRlIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQgd2hlbiBhIHRpdGxlIHRhZyBpcyBmb3VuZCBpbiBuZXcgY29udGVudFxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgaWdub3JlVGl0bGU6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgb2YgYSBib29zdGVkIGVsZW1lbnQgaXMgc2Nyb2xsZWQgaW50byB0aGUgdmlld3BvcnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEludG9WaWV3T25Cb29zdDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNhY2hlIHRvIHN0b3JlIGV2YWx1YXRlZCB0cmlnZ2VyIHNwZWNpZmljYXRpb25zIGludG8uXG4gICAgICAgKiBZb3UgbWF5IGRlZmluZSBhIHNpbXBsZSBvYmplY3QgdG8gdXNlIGEgbmV2ZXItY2xlYXJpbmcgY2FjaGUsIG9yIGltcGxlbWVudCB5b3VyIG93biBzeXN0ZW0gdXNpbmcgYSBbcHJveHkgb2JqZWN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSlcbiAgICAgICAqIEB0eXBlIHtPYmplY3R8bnVsbH1cbiAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAqL1xuICAgICAgdHJpZ2dlclNwZWNzQ2FjaGU6IG51bGwsXG4gICAgICAvKiogQHR5cGUgYm9vbGVhbiAqL1xuICAgICAgZGlzYWJsZUluaGVyaXRhbmNlOiBmYWxzZSxcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1tdICovXG4gICAgICByZXNwb25zZUhhbmRsaW5nOiBbXG4gICAgICAgIHsgY29kZTogJzIwNCcsIHN3YXA6IGZhbHNlIH0sXG4gICAgICAgIHsgY29kZTogJ1syM10uLicsIHN3YXA6IHRydWUgfSxcbiAgICAgICAgeyBjb2RlOiAnWzQ1XS4uJywgc3dhcDogZmFsc2UsIGVycm9yOiB0cnVlIH1cbiAgICAgIF0sXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gcHJvY2VzcyBPT0Igc3dhcHMgb24gZWxlbWVudHMgdGhhdCBhcmUgbmVzdGVkIHdpdGhpbiB0aGUgbWFpbiByZXNwb25zZSBlbGVtZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd05lc3RlZE9vYlN3YXBzOiB0cnVlXG4gICAgfSxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwYXJzZUludGVydmFsfSAqL1xuICAgIHBhcnNlSW50ZXJ2YWw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgaW50ZXJuYWxFdmFsfSAqL1xuICAgIF86IG51bGwsXG4gICAgdmVyc2lvbjogJzIuMC4yJ1xuICB9XG4gIC8vIFRzYyBtYWRuZXNzIHBhcnQgMlxuICBodG14Lm9uTG9hZCA9IG9uTG9hZEhlbHBlclxuICBodG14LnByb2Nlc3MgPSBwcm9jZXNzTm9kZVxuICBodG14Lm9uID0gYWRkRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC5vZmYgPSByZW1vdmVFdmVudExpc3RlbmVySW1wbFxuICBodG14LnRyaWdnZXIgPSB0cmlnZ2VyRXZlbnRcbiAgaHRteC5hamF4ID0gYWpheEhlbHBlclxuICBodG14LmZpbmQgPSBmaW5kXG4gIGh0bXguZmluZEFsbCA9IGZpbmRBbGxcbiAgaHRteC5jbG9zZXN0ID0gY2xvc2VzdFxuICBodG14LnJlbW92ZSA9IHJlbW92ZUVsZW1lbnRcbiAgaHRteC5hZGRDbGFzcyA9IGFkZENsYXNzVG9FbGVtZW50XG4gIGh0bXgucmVtb3ZlQ2xhc3MgPSByZW1vdmVDbGFzc0Zyb21FbGVtZW50XG4gIGh0bXgudG9nZ2xlQ2xhc3MgPSB0b2dnbGVDbGFzc09uRWxlbWVudFxuICBodG14LnRha2VDbGFzcyA9IHRha2VDbGFzc0ZvckVsZW1lbnRcbiAgaHRteC5zd2FwID0gc3dhcFxuICBodG14LmRlZmluZUV4dGVuc2lvbiA9IGRlZmluZUV4dGVuc2lvblxuICBodG14LnJlbW92ZUV4dGVuc2lvbiA9IHJlbW92ZUV4dGVuc2lvblxuICBodG14LmxvZ0FsbCA9IGxvZ0FsbFxuICBodG14LmxvZ05vbmUgPSBsb2dOb25lXG4gIGh0bXgucGFyc2VJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWxcbiAgaHRteC5fID0gaW50ZXJuYWxFdmFsXG5cbiAgY29uc3QgaW50ZXJuYWxBUEkgPSB7XG4gICAgYWRkVHJpZ2dlckhhbmRsZXIsXG4gICAgYm9keUNvbnRhaW5zLFxuICAgIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSxcbiAgICBmaW5kVGhpc0VsZW1lbnQsXG4gICAgZmlsdGVyVmFsdWVzLFxuICAgIHN3YXAsXG4gICAgaGFzQXR0cmlidXRlLFxuICAgIGdldEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0TWF0Y2gsXG4gICAgZ2V0RXhwcmVzc2lvblZhcnMsXG4gICAgZ2V0SGVhZGVycyxcbiAgICBnZXRJbnB1dFZhbHVlcyxcbiAgICBnZXRJbnRlcm5hbERhdGEsXG4gICAgZ2V0U3dhcFNwZWNpZmljYXRpb24sXG4gICAgZ2V0VHJpZ2dlclNwZWNzLFxuICAgIGdldFRhcmdldCxcbiAgICBtYWtlRnJhZ21lbnQsXG4gICAgbWVyZ2VPYmplY3RzLFxuICAgIG1ha2VTZXR0bGVJbmZvLFxuICAgIG9vYlN3YXAsXG4gICAgcXVlcnlTZWxlY3RvckV4dCxcbiAgICBzZXR0bGVJbW1lZGlhdGVseSxcbiAgICBzaG91bGRDYW5jZWwsXG4gICAgdHJpZ2dlckV2ZW50LFxuICAgIHRyaWdnZXJFcnJvckV2ZW50LFxuICAgIHdpdGhFeHRlbnNpb25zXG4gIH1cblxuICBjb25zdCBWRVJCUyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCddXG4gIGNvbnN0IFZFUkJfU0VMRUNUT1IgPSBWRVJCUy5tYXAoZnVuY3Rpb24odmVyYikge1xuICAgIHJldHVybiAnW2h4LScgKyB2ZXJiICsgJ10sIFtkYXRhLWh4LScgKyB2ZXJiICsgJ10nXG4gIH0pLmpvaW4oJywgJylcblxuICBjb25zdCBIRUFEX1RBR19SRUdFWCA9IG1ha2VUYWdSZWdFeCgnaGVhZCcpXG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXRpbGl0aWVzXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge1JlZ0V4cH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VUYWdSZWdFeCh0YWcsIGdsb2JhbCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYDwke3RhZ30oXFxcXHNbXj5dKj58PikoW1xcXFxzXFxcXFNdKj8pPFxcXFwvJHt0YWd9PmAsXG4gICAgICBnbG9iYWwgPyAnZ2ltJyA6ICdpbScpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIGludGVydmFsIHN0cmluZyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBodG14IGRvZXMuIFVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IGhhdmUgdGltaW5nLXJlbGF0ZWQgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQ2F1dGlvbjogQWNjZXB0cyBhbiBpbnQgZm9sbG93ZWQgYnkgZWl0aGVyICoqcyoqIG9yICoqbXMqKi4gQWxsIG90aGVyIHZhbHVlcyB1c2UgKipwYXJzZUZsb2F0KipcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcGFyc2VJbnRlcnZhbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRpbWluZyBzdHJpbmdcbiAgICogQHJldHVybnMge251bWJlcnx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUludGVydmFsKHN0cikge1xuICAgIGlmIChzdHIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgbGV0IGludGVydmFsID0gTmFOXG4gICAgaWYgKHN0ci5zbGljZSgtMikgPT0gJ21zJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMikpXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdzJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMFxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAnbScpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDAgKiA2MFxuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNOYU4oaW50ZXJ2YWwpID8gdW5kZWZpbmVkIDogaW50ZXJ2YWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmF3QXR0cmlidXRlKGVsdCwgbmFtZSkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGVsdC5nZXRBdHRyaWJ1dGUobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIC8vIHJlc29sdmUgd2l0aCBib3RoIGh4IGFuZCBkYXRhLWh4IHByZWZpeGVzXG4gIGZ1bmN0aW9uIGhhc0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gISFlbHQuaGFzQXR0cmlidXRlICYmIChlbHQuaGFzQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpIHx8XG4gICAgICBlbHQuaGFzQXR0cmlidXRlKCdkYXRhLScgKyBxdWFsaWZpZWROYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuIGdldFJhd0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHx8IGdldFJhd0F0dHJpYnV0ZShlbHQsICdkYXRhLScgKyBxdWFsaWZpZWROYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudEVsdChlbHQpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIGlmICghcGFyZW50ICYmIGVsdC5wYXJlbnROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkgcmV0dXJuIGVsdC5wYXJlbnROb2RlXG4gICAgcmV0dXJuIHBhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICAgIHJldHVybiBkb2N1bWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtOb2RlfERvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Um9vdE5vZGUoZWx0LCBnbG9iYWwpIHtcbiAgICByZXR1cm4gZWx0LmdldFJvb3ROb2RlID8gZWx0LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IGdsb2JhbCB9KSA6IGdldERvY3VtZW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0geyhlOk5vZGUpID0+IGJvb2xlYW59IGNvbmRpdGlvblxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0TWF0Y2goZWx0LCBjb25kaXRpb24pIHtcbiAgICB3aGlsZSAoZWx0ICYmICFjb25kaXRpb24oZWx0KSkge1xuICAgICAgZWx0ID0gcGFyZW50RWx0KGVsdClcbiAgICB9XG5cbiAgICByZXR1cm4gZWx0IHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGluaXRpYWxFbGVtZW50XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gYW5jZXN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoaW5pdGlhbEVsZW1lbnQsIGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBkaXNpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1kaXNpbmhlcml0JylcbiAgICB2YXIgaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtaW5oZXJpdCcpXG4gICAgaWYgKGluaXRpYWxFbGVtZW50ICE9PSBhbmNlc3Rvcikge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmRpc2FibGVJbmhlcml0YW5jZSkge1xuICAgICAgICBpZiAoaW5oZXJpdCAmJiAoaW5oZXJpdCA9PT0gJyonIHx8IGluaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpc2luaGVyaXQgJiYgKGRpc2luaGVyaXQgPT09ICcqJyB8fCBkaXNpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICByZXR1cm4gJ3Vuc2V0J1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBsZXQgY2xvc2VzdEF0dHIgPSBudWxsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuICEhKGNsb3Nlc3RBdHRyID0gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoZWx0LCBhc0VsZW1lbnQoZSksIGF0dHJpYnV0ZU5hbWUpKVxuICAgIH0pXG4gICAgaWYgKGNsb3Nlc3RBdHRyICE9PSAndW5zZXQnKSB7XG4gICAgICByZXR1cm4gY2xvc2VzdEF0dHJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMgZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRWYXJpYWJsZVxuICAgIGNvbnN0IG1hdGNoZXNGdW5jdGlvbiA9IGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgKGVsdC5tYXRjaGVzIHx8IGVsdC5tYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWx0LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbHQub01hdGNoZXNTZWxlY3RvcilcbiAgICByZXR1cm4gISFtYXRjaGVzRnVuY3Rpb24gJiYgbWF0Y2hlc0Z1bmN0aW9uLmNhbGwoZWx0LCBzZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdGFydFRhZyhzdHIpIHtcbiAgICBjb25zdCB0YWdNYXRjaGVyID0gLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pXG4gICAgY29uc3QgbWF0Y2ggPSB0YWdNYXRjaGVyLmV4ZWMoc3RyKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSFRNTChyZXNwKSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpXG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcCwgJ3RleHQvaHRtbCcpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBlbHQpIHtcbiAgICB3aGlsZSAoZWx0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsdC5jaGlsZE5vZGVzWzBdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge0hUTUxTY3JpcHRFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZHVwbGljYXRlU2NyaXB0KHNjcmlwdCkge1xuICAgIGNvbnN0IG5ld1NjcmlwdCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICBmb3JFYWNoKHNjcmlwdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBuZXdTY3JpcHQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICB9KVxuICAgIG5ld1NjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdC50ZXh0Q29udGVudFxuICAgIG5ld1NjcmlwdC5hc3luYyA9IGZhbHNlXG4gICAgaWYgKGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlKSB7XG4gICAgICBuZXdTY3JpcHQubm9uY2UgPSBodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZVxuICAgIH1cbiAgICByZXR1cm4gbmV3U2NyaXB0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpIHtcbiAgICByZXR1cm4gc2NyaXB0Lm1hdGNoZXMoJ3NjcmlwdCcpICYmIChzY3JpcHQudHlwZSA9PT0gJ3RleHQvamF2YXNjcmlwdCcgfHwgc2NyaXB0LnR5cGUgPT09ICdtb2R1bGUnIHx8IHNjcmlwdC50eXBlID09PSAnJylcbiAgfVxuXG4gIC8qKlxuICAgKiB3ZSBoYXZlIHRvIG1ha2UgbmV3IGNvcGllcyBvZiBzY3JpcHQgdGFncyB0aGF0IHdlIGFyZSBnb2luZyB0byBpbnNlcnQgYmVjYXVzZVxuICAgKiBTT01FIGJyb3dzZXJzIChub3Qgc2F5aW5nIHdobywgYnV0IGl0IGludm9sdmVzIGFuIGVsZW1lbnQgYW5kIGFuIGFuaW1hbCkgZG9uJ3RcbiAgICogZXhlY3V0ZSBzY3JpcHRzIGNyZWF0ZWQgaW4gPHRlbXBsYXRlPiB0YWdzIHdoZW4gdGhleSBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXG4gICAqIGFuZCBhbGwgdGhlIG90aGVycyBkbyBsbWFvXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpIHtcbiAgICBBcnJheS5mcm9tKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpKS5mb3JFYWNoKC8qKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHQgKi8gKHNjcmlwdCkgPT4ge1xuICAgICAgaWYgKGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSkge1xuICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBzY3JpcHQucGFyZW50Tm9kZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3U2NyaXB0LCBzY3JpcHQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7RG9jdW1lbnRGcmFnbWVudCAmIHt0aXRsZT86IHN0cmluZ319IERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGVcbiAgICogQGRlc2NyaXB0aW9uICBhIGRvY3VtZW50IGZyYWdtZW50IHJlcHJlc2VudGluZyB0aGUgcmVzcG9uc2UgSFRNTCwgaW5jbHVkaW5nXG4gICAqIGEgYHRpdGxlYCBwcm9wZXJ0eSBmb3IgYW55IHRpdGxlIGluZm9ybWF0aW9uIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2UgSFRNTFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VGcmFnbWVudChyZXNwb25zZSkge1xuICAgIC8vIHN0cmlwIGhlYWQgdGFnIHRvIGRldGVybWluZSBzaGFwZSBvZiByZXNwb25zZSB3ZSBhcmUgZGVhbGluZyB3aXRoXG4gICAgY29uc3QgcmVzcG9uc2VXaXRoTm9IZWFkID0gcmVzcG9uc2UucmVwbGFjZShIRUFEX1RBR19SRUdFWCwgJycpXG4gICAgY29uc3Qgc3RhcnRUYWcgPSBnZXRTdGFydFRhZyhyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi9cbiAgICBsZXQgZnJhZ21lbnRcbiAgICBpZiAoc3RhcnRUYWcgPT09ICdodG1sJykge1xuICAgICAgLy8gaWYgaXQgaXMgYSBmdWxsIGRvY3VtZW50LCBwYXJzZSBpdCBhbmQgcmV0dXJuIHRoZSBib2R5XG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIGlmIChzdGFydFRhZyA9PT0gJ2JvZHknKSB7XG4gICAgICAvLyBwYXJzZSBib2R5IHcvbyB3cmFwcGluZyBpbiB0ZW1wbGF0ZVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgbm9uLWJvZHkgcGFydGlhbCBIVE1MIGNvbnRlbnQsIHNvIHdyYXAgaXQgaW4gYSB0ZW1wbGF0ZSB0byBtYXhpbWl6ZSBwYXJzaW5nIGZsZXhpYmlsaXR5XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwoJzxib2R5Pjx0ZW1wbGF0ZSBjbGFzcz1cImludGVybmFsLWh0bXgtd3JhcHBlclwiPicgKyByZXNwb25zZVdpdGhOb0hlYWQgKyAnPC90ZW1wbGF0ZT48L2JvZHk+JylcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKGRvYy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpLmNvbnRlbnQpXG4gICAgICAvLyBleHRyYWN0IHRpdGxlIGludG8gZnJhZ21lbnQgZm9yIGxhdGVyIHByb2Nlc3NpbmdcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG5cbiAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyB3ZSBzdXBwb3J0IGEgdGl0bGUgdGFnIGF0IHRoZSByb290IGxldmVsIG9mIG5vbi1ib2R5IHJlc3BvbnNlcywgc28gd2UgbmVlZCB0byBoYW5kbGUgaXRcbiAgICAgIHZhciB0aXRsZUVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbGVtZW50ICYmIHRpdGxlRWxlbWVudC5wYXJlbnROb2RlID09PSBmcmFnbWVudCkge1xuICAgICAgICB0aXRsZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgICAgZnJhZ21lbnQudGl0bGUgPSB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93U2NyaXB0VGFncykge1xuICAgICAgICBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBzY3JpcHQgdGFncyBpZiBzY3JpcHRzIGFyZSBkaXNhYmxlZFxuICAgICAgICBmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKS5mb3JFYWNoKChzY3JpcHQpID0+IHNjcmlwdC5yZW1vdmUoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVDYWxsKGZ1bmMpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgZnVuYygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBpc1R5cGUobywgdHlwZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIEZ1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIE9iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUmF3T2JqZWN0KG8pIHtcbiAgICByZXR1cm4gaXNUeXBlKG8sICdPYmplY3QnKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9uSGFuZGxlclxuICAgKiBAcHJvcGVydHkgeyhrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwKXxzdHJpbmd9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RlbmVySW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IG9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14Tm9kZUludGVybmFsRGF0YVxuICAgKiBFbGVtZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbml0SGFzaF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYm9vc3RlZF1cbiAgICogQHByb3BlcnR5IHtPbkhhbmRsZXJbXX0gW29uSGFuZGxlcnNdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHByb3BlcnR5IHtMaXN0ZW5lckluZm9bXX0gW2xpc3RlbmVySW5mb3NdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhbmNlbGxlZF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdHJpZ2dlcmVkT25jZV1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheWVkXVxuICAgKiBAcHJvcGVydHkge251bWJlcnxudWxsfSBbdGhyb3R0bGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFzdFZhbHVlXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2FkZWRdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJiXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwb2xsaW5nXVxuICAgKiBAcHJvcGVydHkge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8bnVsbH0gW2xhc3RCdXR0b25DbGlja2VkXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3JlcXVlc3RDb3VudF1cbiAgICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0gW3hocl1cbiAgICogQHByb3BlcnR5IHsoKCkgPT4gdm9pZClbXX0gW3F1ZXVlZFJlcXVlc3RzXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthYm9ydGFibGVdXG4gICAqXG4gICAqIEV2ZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IFt0cmlnZ2VyU3BlY11cbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldFtdfSBbaGFuZGxlZEZvcl1cbiAgICovXG5cbiAgLyoqXG4gICAqIGdldEludGVybmFsRGF0YSByZXRyaWV2ZXMgXCJwcml2YXRlXCIgZGF0YSBzdG9yZWQgYnkgaHRteCB3aXRoaW4gYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEV2ZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxEYXRhKGVsdCkge1xuICAgIGNvbnN0IGRhdGFQcm9wID0gJ2h0bXgtaW50ZXJuYWwtZGF0YSdcbiAgICBsZXQgZGF0YSA9IGVsdFtkYXRhUHJvcF1cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGRhdGEgPSBlbHRbZGF0YVByb3BdID0ge31cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0FycmF5IGNvbnZlcnRzIGFuIEFycmF5TGlrZSBvYmplY3QgaW50byBhIHJlYWwgYXJyYXkuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHJldHVybnMge1RbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkoYXJyKSB7XG4gICAgY29uc3QgcmV0dXJuQXJyID0gW11cbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXR1cm5BcnIucHVzaChhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5BcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1RbXXxOYW1lZE5vZGVNYXB8SFRNTENvbGxlY3Rpb258SFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb258QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHBhcmFtIHsoVCkgPT4gdm9pZH0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gZm9yRWFjaChhcnIsIGZ1bmMpIHtcbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBmdW5jKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsZWRJbnRvVmlldyhlbCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGVsZW1Ub3AgPSByZWN0LnRvcFxuICAgIGNvbnN0IGVsZW1Cb3R0b20gPSByZWN0LmJvdHRvbVxuICAgIHJldHVybiBlbGVtVG9wIDwgd2luZG93LmlubmVySGVpZ2h0ICYmIGVsZW1Cb3R0b20gPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gYm9keUNvbnRhaW5zKGVsdCkge1xuICAgIC8vIElFIEZpeFxuICAgIGNvbnN0IHJvb3ROb2RlID0gZWx0LmdldFJvb3ROb2RlICYmIGVsdC5nZXRSb290Tm9kZSgpXG4gICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QpIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMocm9vdE5vZGUuaG9zdClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHNwbGl0T25XaGl0ZXNwYWNlKHRyaWdnZXIpIHtcbiAgICByZXR1cm4gdHJpZ2dlci50cmltKCkuc3BsaXQoL1xccysvKVxuICB9XG5cbiAgLyoqXG4gICAqIG1lcmdlT2JqZWN0cyB0YWtlcyBhbGwgdGhlIGtleXMgZnJvbVxuICAgKiBvYmoyIGFuZCBkdXBsaWNhdGVzIHRoZW0gaW50byBvYmoxXG4gICAqIEB0ZW1wbGF0ZSBUMVxuICAgKiBAdGVtcGxhdGUgVDJcbiAgICogQHBhcmFtIHtUMX0gb2JqMVxuICAgKiBAcGFyYW0ge1QyfSBvYmoyXG4gICAqIEByZXR1cm5zIHtUMSAmIFQyfVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmoyKSB7XG4gICAgICBpZiAob2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgcmV0dXJuIG9iajFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30galN0cmluZ1xuICAgKiBAcmV0dXJucyB7YW55fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUpTT04oalN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShqU3RyaW5nKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dFcnJvcihlcnJvcilcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkge1xuICAgIGNvbnN0IHRlc3QgPSAnaHRteDpsb2NhbFN0b3JhZ2VUZXN0J1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KVxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoKVxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBwYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCB1bmxlc3MgaW5kZXggcGFnZVxuICAgICAgaWYgKCEoL15cXC8kLy50ZXN0KHBhdGgpKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBiZSBraW5kIHRvIElFMTEsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBVUkwoKVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHVibGljIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gaW50ZXJuYWxFdmFsKHN0cikge1xuICAgIHJldHVybiBtYXliZUV2YWwoZ2V0RG9jdW1lbnQoKS5ib2R5LCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBldmFsKHN0cilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjYWxsYmFjayBmb3IgdGhlICoqaHRteDpsb2FkKiogZXZlbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvY2VzcyBuZXcgY29udGVudCwgZm9yIGV4YW1wbGUgaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50IHdpdGggYSBqYXZhc2NyaXB0IGxpYnJhcnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25Mb2FkXG4gICAqXG4gICAqIEBwYXJhbSB7KGVsdDogTm9kZSkgPT4gdm9pZH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGNhbGwgb24gbmV3bHkgbG9hZGVkIGNvbnRlbnRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvbkxvYWRIZWxwZXIoY2FsbGJhY2spIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0bXgub24oJ2h0bXg6bG9hZCcsIC8qKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldnQgKi8gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjYWxsYmFjayhldnQuZGV0YWlsLmVsdClcbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIExvZyBhbGwgaHRteCBldmVudHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dBbGxcbiAgICovXG4gIGZ1bmN0aW9uIGxvZ0FsbCgpIHtcbiAgICBodG14LmxvZ2dlciA9IGZ1bmN0aW9uKGVsdCwgZXZlbnQsIGRhdGEpIHtcbiAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LCBlbHQsIGRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nTm9uZSgpIHtcbiAgICBodG14LmxvZ2dlciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudCBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZEFsbFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudHMgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD59XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQWxsKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRBbGwoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgV2luZG93XG4gICAqL1xuICBmdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHdpbmRvd1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsdCwgZGVsYXkpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUVsZW1lbnQoZWx0KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RWx0KGVsdCkucmVtb3ZlQ2hpbGQoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0h0bWxFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqIEByZXR1cm4ge1BhcmVudE5vZGV8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzUGFyZW50Tm9kZShlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFkZHMgYSBjbGFzcyB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWRkQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgY2xhc3MgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byBhZGRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSBjbGFzcyBpcyBhZGRlZFxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eiwgZGVsYXkpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0LmNsYXNzTGlzdCAmJiBlbHQuY2xhc3NMaXN0LmFkZChjbGF6eilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsYXNzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gbm9kZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgY2xhc3MgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgY2xhc3MgaXMgcmVtb3ZlZClcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQobm9kZSwgY2xhenosIGRlbGF5KSB7XG4gICAgbGV0IGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KG5vZGUpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShjbGF6eilcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGNsYXNzZXMgbGVmdCwgcmVtb3ZlIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGdpdmVuIGNsYXNzIG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdG9nZ2xlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRvZ2dsZSB0aGUgY2xhc3Mgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0b2dnbGVcbiAgICovXG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzT25FbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBlbHQuY2xhc3NMaXN0LnRvZ2dsZShjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSBpdHMgc2libGluZ3MsIHNvIHRoYXQgYW1vbmcgaXRzIHNpYmxpbmdzLCBvbmx5IHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Rha2VDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRha2UgdGhlIGNsYXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdGFrZVxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNsYXNzRm9yRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZm9yRWFjaChlbHQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXp6KVxuICAgIH0pXG4gICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGVsdCksIGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjbG9zZXN0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzIHBhcmVudGFnZSwgaW5jbHVzaXZlIG9mIHRoZSBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2Nsb3Nlc3RcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIHNlbGVjdG9yIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBmaW5kXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZXN0KGVsdCwgc2VsZWN0b3IpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmIChlbHQgJiYgZWx0LmNsb3Nlc3QpIHtcbiAgICAgIHJldHVybiBlbHQuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyByZW1vdmUgd2hlbiBJRSBnb2VzIGF3YXlcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGVsdCA9PSBudWxsIHx8IG1hdGNoZXMoZWx0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbHQgPSBlbHQgJiYgYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSlcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwcmVmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzdWZmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgPT09IHN1ZmZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICBjb25zdCB0cmltbWVkU2VsZWN0b3IgPSBzZWxlY3Rvci50cmltKClcbiAgICBpZiAoc3RhcnRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICc8JykgJiYgZW5kc1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnLz4nKSkge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3Rvci5zdWJzdHJpbmcoMSwgdHJpbW1lZFNlbGVjdG9yLmxlbmd0aCAtIDIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfEVsZW1lbnR8RG9jdW1lbnR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLCBnbG9iYWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoc2VsZWN0b3IuaW5kZXhPZignY2xvc2VzdCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtjbG9zZXN0KGFzRWxlbWVudChlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOCkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2ZpbmQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbZmluZChhc1BhcmVudE5vZGUoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ25leHQnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLm5leHRFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ25leHQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkZvcndhcmRRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncHJldmlvdXMnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdwcmV2aW91cyAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuQmFja3dhcmRzUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudF1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnd2luZG93Jykge1xuICAgICAgcmV0dXJuIFt3aW5kb3ddXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2JvZHknKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50LmJvZHldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3Jvb3QnKSB7XG4gICAgICByZXR1cm4gW2dldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZ2xvYmFsICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLnNsaWNlKDcpLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdG9BcnJheShhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkZvcndhcmRRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5CYWNrd2FyZHNRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd31cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3RvcilbMF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZ2V0RG9jdW1lbnQoKS5ib2R5LCBlbHRPclNlbGVjdG9yKVswXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge0V2ZW50VGFyZ2V0fSBUXG4gICAqIEBwYXJhbSB7VHxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtUfSBbY29udGV4dF1cbiAgICogQHJldHVybnMge0VsZW1lbnR8VHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVRhcmdldChlbHRPclNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZpbmQoYXNQYXJlbnROb2RlKGNvbnRleHQpIHx8IGRvY3VtZW50LCBlbHRPclNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7a2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcHxzdHJpbmd9IEFueUV2ZW50TmFtZVxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXZlbnRBcmdzXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICAgKiBAcHJvcGVydHkge0FueUV2ZW50TmFtZX0gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxBbnlFdmVudE5hbWV9IGFyZzFcbiAgICogQHBhcmFtIHtBbnlFdmVudE5hbWV8RXZlbnRMaXN0ZW5lcn0gYXJnMlxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXVxuICAgKiBAcmV0dXJucyB7RXZlbnRBcmdzfVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oYXJnMikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogZ2V0RG9jdW1lbnQoKS5ib2R5LFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMSksXG4gICAgICAgIGxpc3RlbmVyOiBhcmcyXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogcmVzb2x2ZVRhcmdldChhcmcxKSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzIpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnM1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBsaXN0ZW5lciB0byB8IHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3IgfCB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICBjb25zdCBiID0gaXNGdW5jdGlvbihhcmcyKVxuICAgIHJldHVybiBiID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvZmZcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oYXJnMikgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTm9kZSBwcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3QgRFVNTVlfRUxUID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdvdXRwdXQnKSAvLyBkdW1teSBlbGVtZW50IGZvciBiYWQgc2VsZWN0b3JzXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ck5hbWVcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgYXR0ck5hbWUpIHtcbiAgICBjb25zdCBhdHRyVGFyZ2V0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0ck5hbWUpXG4gICAgaWYgKGF0dHJUYXJnZXQpIHtcbiAgICAgIGlmIChhdHRyVGFyZ2V0ID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIFtmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyTmFtZSldXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgYXR0clRhcmdldClcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsb2dFcnJvcignVGhlIHNlbGVjdG9yIFwiJyArIGF0dHJUYXJnZXQgKyAnXCIgb24gJyArIGF0dHJOYW1lICsgJyByZXR1cm5lZCBubyBtYXRjaGVzIScpXG4gICAgICAgICAgcmV0dXJuIFtEVU1NWV9FTFRdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBhc0VsZW1lbnQoZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoYXNFbGVtZW50KGVsdCksIGF0dHJpYnV0ZSkgIT0gbnVsbFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VGFyZ2V0KGVsdCkge1xuICAgIGNvbnN0IHRhcmdldFN0ciA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKVxuICAgIGlmICh0YXJnZXRTdHIpIHtcbiAgICAgIGlmICh0YXJnZXRTdHIgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRhcmdldFN0cilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAoZGF0YS5ib29zdGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUobmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXNUb1NldHRsZSA9IGh0bXguY29uZmlnLmF0dHJpYnV0ZXNUb1NldHRsZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlc1RvU2V0dGxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmFtZSA9PT0gYXR0cmlidXRlc1RvU2V0dGxlW2ldKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VUb1xuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlRnJvbVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvbmVBdHRyaWJ1dGVzKG1lcmdlVG8sIG1lcmdlRnJvbSkge1xuICAgIGZvckVhY2gobWVyZ2VUby5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoIW1lcmdlRnJvbS5oYXNBdHRyaWJ1dGUoYXR0ci5uYW1lKSAmJiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKG1lcmdlRnJvbS5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpIHtcbiAgICBjb25zdCBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyh0YXJnZXQpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzSW5saW5lU3dhcChzd2FwU3R5bGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFN0eWxlID09PSAnb3V0ZXJIVE1MJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvb2JWYWx1ZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9vYkVsZW1lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGxldCBzZWxlY3RvciA9ICcjJyArIGdldFJhd0F0dHJpYnV0ZShvb2JFbGVtZW50LCAnaWQnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFN0eWxlICovXG4gICAgbGV0IHN3YXBTdHlsZSA9ICdvdXRlckhUTUwnXG4gICAgaWYgKG9vYlZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKG9vYlZhbHVlLmluZGV4T2YoJzonKSA+IDApIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlLnN1YnN0cigwLCBvb2JWYWx1ZS5pbmRleE9mKCc6JykpXG4gICAgICBzZWxlY3RvciA9IG9vYlZhbHVlLnN1YnN0cihvb2JWYWx1ZS5pbmRleE9mKCc6JykgKyAxLCBvb2JWYWx1ZS5sZW5ndGgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICBpZiAodGFyZ2V0cykge1xuICAgICAgZm9yRWFjaChcbiAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgICAgbGV0IGZyYWdtZW50XG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudENsb25lID0gb29iRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICBmcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQob29iRWxlbWVudENsb25lKVxuICAgICAgICAgIGlmICghaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBhc1BhcmVudE5vZGUob29iRWxlbWVudENsb25lKSAvLyBpZiB0aGlzIGlzIG5vdCBhbiBpbmxpbmUgc3dhcCwgd2UgdXNlIHRoZSBjb250ZW50IG9mIHRoZSBub2RlLCBub3QgdGhlIG5vZGUgaXRzZWxmXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlU3dhcERldGFpbHMgPSB7IHNob3VsZFN3YXA6IHRydWUsIHRhcmdldCwgZnJhZ21lbnQgfVxuICAgICAgICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6b29iQmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICAgICAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgICAgICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgICAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCB0YXJnZXQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14Om9vYkFmdGVyU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6b29iRXJyb3JOb1RhcmdldCcsIHsgY29udGVudDogb29iRWxlbWVudCB9KVxuICAgIH1cbiAgICByZXR1cm4gb29iVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudCkge1xuICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ1toeC1wcmVzZXJ2ZV0sIFtkYXRhLWh4LXByZXNlcnZlXScpLCBmdW5jdGlvbihwcmVzZXJ2ZWRFbHQpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0QXR0cmlidXRlVmFsdWUocHJlc2VydmVkRWx0LCAnaWQnKVxuICAgICAgY29uc3Qgb2xkRWx0ID0gZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgIGlmIChvbGRFbHQgIT0gbnVsbCkge1xuICAgICAgICBwcmVzZXJ2ZWRFbHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQob2xkRWx0LCBwcmVzZXJ2ZWRFbHQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyksIGZ1bmN0aW9uKG5ld05vZGUpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UmF3QXR0cmlidXRlKG5ld05vZGUsICdpZCcpXG4gICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkSWQgPSBpZC5yZXBsYWNlKFwiJ1wiLCBcIlxcXFwnXCIpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYWcgPSBuZXdOb2RlLnRhZ05hbWUucmVwbGFjZSgnOicsICdcXFxcOicpXG4gICAgICAgIGNvbnN0IHBhcmVudEVsdCA9IGFzUGFyZW50Tm9kZShwYXJlbnROb2RlKVxuICAgICAgICBjb25zdCBvbGROb2RlID0gcGFyZW50RWx0ICYmIHBhcmVudEVsdC5xdWVyeVNlbGVjdG9yKG5vcm1hbGl6ZWRUYWcgKyBcIltpZD0nXCIgKyBub3JtYWxpemVkSWQgKyBcIiddXCIpXG4gICAgICAgIGlmIChvbGROb2RlICYmIG9sZE5vZGUgIT09IHBhcmVudEVsdCkge1xuICAgICAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBuZXdOb2RlLmNsb25lTm9kZSgpXG4gICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG9sZE5vZGUpXG4gICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG5ld0F0dHJpYnV0ZXMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBjaGlsZFxuICAgKiBAcmV0dXJucyB7SHRteFNldHRsZVRhc2t9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlQWpheExvYWRUYXNrKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHByb2Nlc3NOb2RlKGFzRWxlbWVudChjaGlsZCkpXG4gICAgICBwcm9jZXNzRm9jdXMoYXNQYXJlbnROb2RlKGNoaWxkKSlcbiAgICAgIHRyaWdnZXJFdmVudChjaGlsZCwgJ2h0bXg6bG9hZCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gY2hpbGRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NGb2N1cyhjaGlsZCkge1xuICAgIGNvbnN0IGF1dG9mb2N1cyA9ICdbYXV0b2ZvY3VzXSdcbiAgICBjb25zdCBhdXRvRm9jdXNlZEVsdCA9IGFzSHRtbEVsZW1lbnQobWF0Y2hlcyhjaGlsZCwgYXV0b2ZvY3VzKSA/IGNoaWxkIDogY2hpbGQucXVlcnlTZWxlY3RvcihhdXRvZm9jdXMpKVxuICAgIGlmIChhdXRvRm9jdXNlZEVsdCAhPSBudWxsKSB7XG4gICAgICBhdXRvRm9jdXNlZEVsdC5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge05vZGV9IGluc2VydEJlZm9yZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydEJlZm9yZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIHdoaWxlIChmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZFxuICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGNoaWxkKSwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbnNlcnRCZWZvcmUpXG4gICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJhc2VkIG9uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2h5YW1hbW90by9mZDQzNTUwNWQyOWViZmEzZDk3MTZmZDJiZThkNDJmMCxcbiAgICogZGVyaXZlZCBmcm9tIEphdmEncyBzdHJpbmcgaGFzaGNvZGUgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaGFzaFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nSGFzaChzdHJpbmcsIGhhc2gpIHtcbiAgICBsZXQgY2hhciA9IDBcbiAgICB3aGlsZSAoY2hhciA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBzdHJpbmcuY2hhckNvZGVBdChjaGFyKyspIHwgMCAvLyBiaXR3aXNlIG9yIGVuc3VyZXMgd2UgaGF2ZSBhIDMyLWJpdCBpbnRcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYXR0cmlidXRlSGFzaChlbHQpIHtcbiAgICBsZXQgaGFzaCA9IDBcbiAgICAvLyBJRSBmaXhcbiAgICBpZiAoZWx0LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWx0LmF0dHJpYnV0ZXNbaV1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZS52YWx1ZSkgeyAvLyBvbmx5IGluY2x1ZGUgYXR0cmlidXRlcyB3LyBhY3R1YWwgdmFsdWVzIChlbXB0eSBpcyBzYW1lIGFzIG5vbi1leGlzdGVudClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUubmFtZSwgaGFzaClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUudmFsdWUsIGhhc2gpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE9uSGFuZGxlcnMoZWx0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZm8gPSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1tpXVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChlbHQsIGhhbmRsZXJJbmZvLmV2ZW50LCBoYW5kbGVySW5mby5saXN0ZW5lcilcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE5vZGUoZWxlbWVudCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbGVtZW50KVxuICAgIGlmIChpbnRlcm5hbERhdGEudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVybmFsRGF0YS50aW1lb3V0KVxuICAgIH1cbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MpIHtcbiAgICAgIGZvckVhY2goaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MsIGZ1bmN0aW9uKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8ub24pIHtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChpbmZvLm9uLCBpbmZvLnRyaWdnZXIsIGluZm8ubGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWxlbWVudClcbiAgICBmb3JFYWNoKE9iamVjdC5rZXlzKGludGVybmFsRGF0YSksIGZ1bmN0aW9uKGtleSkgeyBkZWxldGUgaW50ZXJuYWxEYXRhW2tleV0gfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuVXBFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKVxuICAgIGRlSW5pdE5vZGUoZWxlbWVudClcbiAgICAvLyBAdHMtaWdub3JlIElFMTEgY29kZVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikgeyAvLyBJRVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yRWFjaChlbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkgeyBjbGVhblVwRWxlbWVudChjaGlsZCkgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiB0YXJnZXQudGFnTmFtZSA9PT0gJ0JPRFknKSB7IC8vIHNwZWNpYWwgY2FzZSB0aGUgYm9keSB0byBpbm5lckhUTUwgYmVjYXVzZSBEb2N1bWVudEZyYWdtZW50cyBjYW4ndCBjb250YWluIGEgYm9keSBlbHQgdW5mb3J0dW5hdGVseVxuICAgICAgcmV0dXJuIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtOb2RlfSAqL1xuICAgIGxldCBuZXdFbHRcbiAgICBjb25zdCBlbHRCZWZvcmVOZXdDb250ZW50ID0gdGFyZ2V0LnByZXZpb3VzU2libGluZ1xuICAgIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChlbHRCZWZvcmVOZXdDb250ZW50ID09IG51bGwpIHtcbiAgICAgIG5ld0VsdCA9IHBhcmVudEVsdCh0YXJnZXQpLmZpcnN0Q2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWx0ID0gZWx0QmVmb3JlTmV3Q29udGVudC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBzZXR0bGVJbmZvLmVsdHMgPSBzZXR0bGVJbmZvLmVsdHMuZmlsdGVyKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUgIT09IHRhcmdldCB9KVxuICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgbmV3bHkgYWRkZWQgY29udGVudCBhbmQgYWRkIGFsbCBlbGVtZW50cyB0byB0aGUgc2V0dGxlIGluZm8gc28gd2UgdHJpZ2dlclxuICAgIC8vIGV2ZW50cyBwcm9wZXJseSBvbiB0aGVtXG4gICAgd2hpbGUgKG5ld0VsdCAmJiBuZXdFbHQgIT09IHRhcmdldCkge1xuICAgICAgaWYgKG5ld0VsdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgc2V0dGxlSW5mby5lbHRzLnB1c2gobmV3RWx0KVxuICAgICAgfVxuICAgICAgbmV3RWx0ID0gbmV3RWx0Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGFyZ2V0LnJlbW92ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgdGFyZ2V0LmZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBudWxsLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQubmV4dFNpYmxpbmcsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqL1xuICBmdW5jdGlvbiBzd2FwRGVsZXRlKHRhcmdldCkge1xuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICByZXR1cm4gcGFyZW50RWx0KHRhcmdldCkucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgY29uc3QgZmlyc3RDaGlsZCA9IHRhcmdldC5maXJzdENoaWxkXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBmaXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgd2hpbGUgKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICB9XG4gICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkKVxuICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHN3aXRjaCAoc3dhcFN0eWxlKSB7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdvdXRlckhUTUwnOlxuICAgICAgICBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJiZWdpbic6XG4gICAgICAgIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlYmVnaW4nOlxuICAgICAgICBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmVlbmQnOlxuICAgICAgICBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJlbmQnOlxuICAgICAgICBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBzd2FwRGVsZXRlKHRhcmdldClcbiAgICAgICAgcmV0dXJuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMoZWx0KVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBleHRlbnNpb25zW2ldXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZXh0LmhhbmRsZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0VsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGhhbmRsZVN3YXAgcmV0dXJucyBhbiBhcnJheSAobGlrZSkgb2YgZWxlbWVudHMsIHdlIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdFbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBuZXdFbGVtZW50c1tqXVxuICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3dhcFN0eWxlID09PSAnaW5uZXJIVE1MJykge1xuICAgICAgICAgIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2FwV2l0aFN0eWxlKGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICB2YXIgb29iRWx0cyA9IGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtc3dhcC1vb2JdLCBbZGF0YS1oeC1zd2FwLW9vYl0nKVxuICAgIGZvckVhY2gob29iRWx0cywgZnVuY3Rpb24ob29iRWxlbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93TmVzdGVkT29iU3dhcHMgfHwgb29iRWxlbWVudC5wYXJlbnRFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG9vYlZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUob29iRWxlbWVudCwgJ2h4LXN3YXAtb29iJylcbiAgICAgICAgaWYgKG9vYlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaHgtc3dhcC1vb2InKVxuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oeC1zd2FwLW9vYicpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gb29iRWx0cy5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBjb21wbGV0ZSBzd2FwcGluZyBwaXBlbGluZSwgaW5jbHVkaW5nOiBmb2N1cyBhbmQgc2VsZWN0aW9uIHByZXNlcnZhdGlvbixcbiAgICogdGl0bGUgdXBkYXRlcywgc2Nyb2xsLCBPT0Igc3dhcHBpbmcsIG5vcm1hbCBzd2FwcGluZyBhbmQgc2V0dGxpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKiBAcGFyYW0ge1N3YXBPcHRpb25zfSBbc3dhcE9wdGlvbnNdXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwKHRhcmdldCwgY29udGVudCwgc3dhcFNwZWMsIHN3YXBPcHRpb25zKSB7XG4gICAgaWYgKCFzd2FwT3B0aW9ucykge1xuICAgICAgc3dhcE9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIHRhcmdldCA9IHJlc29sdmVUYXJnZXQodGFyZ2V0KVxuXG4gICAgLy8gcHJlc2VydmUgZm9jdXMgYW5kIHNlbGVjdGlvblxuICAgIGNvbnN0IGFjdGl2ZUVsdCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICBsZXQgc2VsZWN0aW9uSW5mbyA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIHNlbGVjdGlvbkluZm8gPSB7XG4gICAgICAgIGVsdDogYWN0aXZlRWx0LFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXJ0OiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uU3RhcnQgOiBudWxsLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVuZDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvbkVuZCA6IG51bGxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzYWZhcmkgaXNzdWUgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9wbGF5d3JpZ2h0L2lzc3Vlcy81ODk0XG4gICAgfVxuICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpXG5cbiAgICAvLyBGb3IgdGV4dCBjb250ZW50IHN3YXBzLCBkb24ndCBwYXJzZSB0aGUgcmVzcG9uc2UgYXMgSFRNTCwganVzdCBpbnNlcnQgaXRcbiAgICBpZiAoc3dhcFNwZWMuc3dhcFN0eWxlID09PSAndGV4dENvbnRlbnQnKSB7XG4gICAgICB0YXJnZXQudGV4dENvbnRlbnQgPSBjb250ZW50XG4gICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBmcmFnbWVudCBhbmQgcHJvY2VzcyBpdFxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY29udGVudClcblxuICAgICAgc2V0dGxlSW5mby50aXRsZSA9IGZyYWdtZW50LnRpdGxlXG5cbiAgICAgIC8vIHNlbGVjdC1vb2Igc3dhcHNcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3RPT0IpIHtcbiAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWVzID0gc3dhcE9wdGlvbnMuc2VsZWN0T09CLnNwbGl0KCcsJylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvb2JTZWxlY3RWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlc1tpXS5zcGxpdCgnOicsIDIpXG4gICAgICAgICAgbGV0IGlkID0gb29iU2VsZWN0VmFsdWVbMF0udHJpbSgpXG4gICAgICAgICAgaWYgKGlkLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcoMSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBvb2JTZWxlY3RWYWx1ZVsxXSB8fCAndHJ1ZSdcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignIycgKyBpZClcbiAgICAgICAgICBpZiAob29iRWxlbWVudCkge1xuICAgICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9vYiBzd2Fwc1xuICAgICAgZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ3RlbXBsYXRlJyksIC8qKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlICovZnVuY3Rpb24odGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGZpbmRBbmRTd2FwT29iRWxlbWVudHModGVtcGxhdGUuY29udGVudCwgc2V0dGxlSW5mbykpIHtcbiAgICAgICAgICAvLyBBdm9pZCBwb2xsdXRpbmcgdGhlIERPTSB3aXRoIGVtcHR5IHRlbXBsYXRlcyB0aGF0IHdlcmUgb25seSB1c2VkIHRvIGVuY2Fwc3VsYXRlIG9vYiBzd2FwXG4gICAgICAgICAgdGVtcGxhdGUucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gbm9ybWFsIHN3YXBcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3QpIHtcbiAgICAgICAgY29uc3QgbmV3RnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3dhcE9wdGlvbnMuc2VsZWN0KSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIG5ld0ZyYWdtZW50LmFwcGVuZENoaWxkKG5vZGUpXG4gICAgICAgIH0pXG4gICAgICAgIGZyYWdtZW50ID0gbmV3RnJhZ21lbnRcbiAgICAgIH1cbiAgICAgIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KVxuICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3BlYy5zd2FwU3R5bGUsIHN3YXBPcHRpb25zLmNvbnRleHRFbGVtZW50LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cblxuICAgIC8vIGFwcGx5IHNhdmVkIGZvY3VzIGFuZCBzZWxlY3Rpb24gaW5mb3JtYXRpb24gdG8gc3dhcHBlZCBjb250ZW50XG4gICAgaWYgKHNlbGVjdGlvbkluZm8uZWx0ICYmXG4gICAgICAhYm9keUNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZWx0KSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSkge1xuICAgICAgY29uc3QgbmV3QWN0aXZlRWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSlcbiAgICAgIGNvbnN0IGZvY3VzT3B0aW9ucyA9IHsgcHJldmVudFNjcm9sbDogc3dhcFNwZWMuZm9jdXNTY3JvbGwgIT09IHVuZGVmaW5lZCA/ICFzd2FwU3BlYy5mb2N1c1Njcm9sbCA6ICFodG14LmNvbmZpZy5kZWZhdWx0Rm9jdXNTY3JvbGwgfVxuICAgICAgaWYgKG5ld0FjdGl2ZUVsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChzZWxlY3Rpb25JbmZvLnN0YXJ0ICYmIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uSW5mby5zdGFydCwgc2VsZWN0aW9uSW5mby5lbmQpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdGhlIHNldFNlbGVjdGlvblJhbmdlIG1ldGhvZCBpcyBwcmVzZW50IG9uIGZpZWxkcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQsIHNvIGp1c3QgbGV0IHRoaXMgZmFpbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdBY3RpdmVFbHQuZm9jdXMoZm9jdXNPcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG4gICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU3dhcCcsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICB9KVxuICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaykge1xuICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2soKVxuICAgIH1cblxuICAgIC8vIG1lcmdlIGluIG5ldyB0aXRsZSBhZnRlciBzd2FwIGJ1dCBiZWZvcmUgc2V0dGxlXG4gICAgaWYgKCFzd2FwU3BlYy5pZ25vcmVUaXRsZSkge1xuICAgICAgaGFuZGxlVGl0bGUoc2V0dGxlSW5mby50aXRsZSlcbiAgICB9XG5cbiAgICAvLyBzZXR0bGVcbiAgICBjb25zdCBkb1NldHRsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLnRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgIHRhc2suY2FsbCgpXG4gICAgICB9KVxuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTZXR0bGUnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgICB9KVxuXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYW5jaG9yKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclRhcmdldCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KCcjJyArIHN3YXBPcHRpb25zLmFuY2hvcikpXG4gICAgICAgIGlmIChhbmNob3JUYXJnZXQpIHtcbiAgICAgICAgICBhbmNob3JUYXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6ICdhdXRvJyB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVNjcm9sbFN0YXRlKHNldHRsZUluZm8uZWx0cywgc3dhcFNwZWMpXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaykge1xuICAgICAgICBzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3dhcFNwZWMuc2V0dGxlRGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU2V0dGxlLCBzd2FwU3BlYy5zZXR0bGVEZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TZXR0bGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCBoZWFkZXIsIGVsdCkge1xuICAgIGNvbnN0IHRyaWdnZXJCb2R5ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlcilcbiAgICBpZiAodHJpZ2dlckJvZHkuaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICBjb25zdCB0cmlnZ2VycyA9IHBhcnNlSlNPTih0cmlnZ2VyQm9keSlcbiAgICAgIGZvciAoY29uc3QgZXZlbnROYW1lIGluIHRyaWdnZXJzKSB7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgICAgbGV0IGRldGFpbCA9IHRyaWdnZXJzW2V2ZW50TmFtZV1cbiAgICAgICAgICBpZiAoaXNSYXdPYmplY3QoZGV0YWlsKSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWx0ID0gZGV0YWlsLnRhcmdldCAhPT0gdW5kZWZpbmVkID8gZGV0YWlsLnRhcmdldCA6IGVsdFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRhaWwgPSB7IHZhbHVlOiBkZXRhaWwgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBldmVudE5hbWVzID0gdHJpZ2dlckJvZHkuc3BsaXQoJywnKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZXNbaV0udHJpbSgpLCBbXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBXSElURVNQQUNFID0gL1xccy9cbiAgY29uc3QgV0hJVEVTUEFDRV9PUl9DT01NQSA9IC9bXFxzLF0vXG4gIGNvbnN0IFNZTUJPTF9TVEFSVCA9IC9bXyRhLXpBLVpdL1xuICBjb25zdCBTWU1CT0xfQ09OVCA9IC9bXyRhLXpBLVowLTldL1xuICBjb25zdCBTVFJJTkdJU0hfU1RBUlQgPSBbJ1wiJywgXCInXCIsICcvJ11cbiAgY29uc3QgTk9UX1dISVRFU1BBQ0UgPSAvW15cXHNdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVCA9IC9beyhdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQgPSAvW30pXS9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZVN0cmluZyhzdHIpIHtcbiAgICAvKiogQHR5cGUgc3RyaW5nW10gKi9cbiAgICBjb25zdCB0b2tlbnMgPSBbXVxuICAgIGxldCBwb3NpdGlvbiA9IDBcbiAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoKSB7XG4gICAgICBpZiAoU1lNQk9MX1NUQVJULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbikpKSB7XG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgd2hpbGUgKFNZTUJPTF9DT05ULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbiArIDEpKSkge1xuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIGlmIChTVFJJTkdJU0hfU1RBUlQuaW5kZXhPZihzdHIuY2hhckF0KHBvc2l0aW9uKSkgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2hhciA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoICYmIHN0ci5jaGFyQXQocG9zaXRpb24pICE9PSBzdGFydENoYXIpIHtcbiAgICAgICAgICBpZiAoc3RyLmNoYXJBdChwb3NpdGlvbikgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHRva2Vucy5wdXNoKHN5bWJvbClcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9uKytcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBsYXN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkge1xuICAgIHJldHVybiBTWU1CT0xfU1RBUlQuZXhlYyh0b2tlbi5jaGFyQXQoMCkpICYmXG4gICAgICB0b2tlbiAhPT0gJ3RydWUnICYmXG4gICAgICB0b2tlbiAhPT0gJ2ZhbHNlJyAmJlxuICAgICAgdG9rZW4gIT09ICd0aGlzJyAmJlxuICAgICAgdG9rZW4gIT09IHBhcmFtTmFtZSAmJlxuICAgICAgbGFzdCAhPT0gJy4nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Q29uZGl0aW9uYWxGdW5jdGlvbnxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCBwYXJhbU5hbWUpIHtcbiAgICBpZiAodG9rZW5zWzBdID09PSAnWycpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICBsZXQgYnJhY2tldENvdW50ID0gMVxuICAgICAgbGV0IGNvbmRpdGlvbmFsU291cmNlID0gJyByZXR1cm4gKGZ1bmN0aW9uKCcgKyBwYXJhbU5hbWUgKyAnKXsgcmV0dXJuICgnXG4gICAgICBsZXQgbGFzdCA9IG51bGxcbiAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1swXVxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBzaGlmdCBjYWxsLCBhbmQgdGhpbmtzIHdlJ3JlIGNvbXBhcmluZyB0aGUgc2FtZSB2YWx1ZSBoZXJlLCBpLmUuICdbJyB2cyAnXSdcbiAgICAgICAgaWYgKHRva2VuID09PSAnXScpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQtLVxuICAgICAgICAgIGlmIChicmFja2V0Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChsYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyAndHJ1ZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKX0pJ1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uRnVuY3Rpb24gPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oY29uZGl0aW9uYWxTb3VyY2UpKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pXG4gICAgICAgICAgICAgIGNvbmRpdGlvbkZ1bmN0aW9uLnNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlXG4gICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25GdW5jdGlvblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnN5bnRheDplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZTogY29uZGl0aW9uYWxTb3VyY2UgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdbJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudCsrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSkge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcoKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpID8gKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpIDogKHdpbmRvdy4nICsgdG9rZW4gKyAnKSknXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArIHRva2VuXG4gICAgICAgIH1cbiAgICAgICAgbGFzdCA9IHRva2Vucy5zaGlmdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gbWF0Y2hcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbCh0b2tlbnMsIG1hdGNoKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmICFtYXRjaC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHJlc3VsdCArPSB0b2tlbnMuc2hpZnQoKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKSB7XG4gICAgbGV0IHJlc3VsdFxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMCAmJiBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQpLnRyaW0oKVxuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY29uc3QgSU5QVVRfU0VMRUNUT1IgPSAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBsaWNpdFRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIGZvciB0cmlnZ2VyIHNwZWNzXG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSkge1xuICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXSAqL1xuICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVTdHJpbmcoZXhwbGljaXRUcmlnZ2VyKVxuICAgIGRvIHtcbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IHRva2Vucy5sZW5ndGhcbiAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLylcbiAgICAgIGlmICh0cmlnZ2VyICE9PSAnJykge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2V2ZXJ5Jykge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCBldmVyeSA9IHsgdHJpZ2dlcjogJ2V2ZXJ5JyB9XG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgZXZlcnkucG9sbEludGVydmFsID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLykpXG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgZXZlcnkuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaChldmVyeSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgdHJpZ2dlclNwZWMgPSB7IHRyaWdnZXIgfVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXSAhPT0gJywnKSB7XG4gICAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gJ2NoYW5nZWQnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnb25jZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMub25jZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdjb25zdW1lJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jb25zdW1lID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2RlbGF5JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5kZWxheSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZnJvbScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgaWYgKENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgICAgICBpZiAoZnJvbV9hcmcgPT09ICdjbG9zZXN0JyB8fCBmcm9tX2FyZyA9PT0gJ2ZpbmQnIHx8IGZyb21fYXJnID09PSAnbmV4dCcgfHwgZnJvbV9hcmcgPT09ICdwcmV2aW91cycpIHtcbiAgICAgICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgICAgICAvLyBgbmV4dGAgYW5kIGBwcmV2aW91c2AgYWxsb3cgYSBzZWxlY3Rvci1sZXNzIHN5bnRheFxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbV9hcmcgKz0gJyAnICsgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZnJvbSA9IGZyb21fYXJnXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGFyZ2V0JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50YXJnZXQgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Rocm90dGxlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50aHJvdHRsZSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncXVldWUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnF1ZXVlID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdyb290JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RocmVzaG9sZCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2godHJpZ2dlclNwZWMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSBpbml0aWFsTGVuZ3RoKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgIH0gd2hpbGUgKHRva2Vuc1swXSA9PT0gJywnICYmIHRva2Vucy5zaGlmdCgpKVxuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSA9IHRyaWdnZXJTcGVjc1xuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VHJpZ2dlclNwZWNzKGVsdCkge1xuICAgIGNvbnN0IGV4cGxpY2l0VHJpZ2dlciA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRyaWdnZXInKVxuICAgIGxldCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGlmIChleHBsaWNpdFRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gaHRteC5jb25maWcudHJpZ2dlclNwZWNzQ2FjaGVcbiAgICAgIHRyaWdnZXJTcGVjcyA9IChjYWNoZSAmJiBjYWNoZVtleHBsaWNpdFRyaWdnZXJdKSB8fCBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpXG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJTcGVjcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdzdWJtaXQnIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJidXR0b25cIl0sIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCBJTlBVVF9TRUxFQ1RPUikpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2hhbmdlJyB9XVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gY2FuY2VsUG9sbGluZyhlbHQpIHtcbiAgICBnZXRJbnRlcm5hbERhdGEoZWx0KS5jYW5jZWxsZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gc3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIG5vZGVEYXRhLnRpbWVvdXQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGJvZHlDb250YWlucyhlbHQpICYmIG5vZGVEYXRhLmNhbmNlbGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQoc3BlYywgZWx0LCBtYWtlRXZlbnQoJ2h4OnBvbGw6dHJpZ2dlcicsIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlYzogc3BlYyxcbiAgICAgICAgICB0YXJnZXQ6IGVsdFxuICAgICAgICB9KSkpIHtcbiAgICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpXG4gICAgICB9XG4gICAgfSwgc3BlYy5wb2xsSW50ZXJ2YWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MQW5jaG9yRWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNMb2NhbExpbmsoZWx0KSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uLmhvc3RuYW1lID09PSBlbHQuaG9zdG5hbWUgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpICE9PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGVsdElzRGlzYWJsZWQoZWx0KSB7XG4gICAgcmV0dXJuIGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqL1xuICBmdW5jdGlvbiBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgaWYgKChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBpc0xvY2FsTGluayhlbHQpICYmIChlbHQudGFyZ2V0ID09PSAnJyB8fCBlbHQudGFyZ2V0ID09PSAnX3NlbGYnKSkgfHwgKGVsdC50YWdOYW1lID09PSAnRk9STScgJiYgU3RyaW5nKGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKSkudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpKSB7XG4gICAgICBub2RlRGF0YS5ib29zdGVkID0gdHJ1ZVxuICAgICAgbGV0IHZlcmIsIHBhdGhcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgIHZlcmIgPSAnZ2V0J1xuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3QXR0cmlidXRlID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpXG4gICAgICAgIHZlcmIgPSByYXdBdHRyaWJ1dGUgPyByYXdBdHRyaWJ1dGUudG9Mb3dlckNhc2UoKSA6ICdnZXQnXG4gICAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgICB9XG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnYWN0aW9uJylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgfSwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZENhbmNlbChldnQsIG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChldnQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZXZ0LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwic3VibWl0XCJdLCBidXR0b24nKSAmJiBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGVsdC5ocmVmICYmXG4gICAgICAgIChlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT09ICcjJyB8fCBlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykuaW5kZXhPZignIycpICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fE1vdXNlRXZlbnR8S2V5Ym9hcmRFdmVudHxUb3VjaEV2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZXZ0LnR5cGUgPT09ICdjbGljaycgJiZcbiAgICAgIC8vIEB0cy1pZ25vcmUgdGhpcyB3aWxsIHJlc29sdmUgdG8gdW5kZWZpbmVkIGZvciBldmVudHMgdGhhdCBkb24ndCBkZWZpbmUgdGhvc2UgcHJvcGVydGllcywgd2hpY2ggaXMgZmluZVxuICAgICAgKGV2dC5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkge1xuICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXJcbiAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEZpbHRlci5jYWxsKGVsdCwgZXZ0KSAhPT0gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmVudEZpbHRlci5zb3VyY2VcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpldmVudEZpbHRlcjplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtleHBsaWNpdENhbmNlbF1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIGV4cGxpY2l0Q2FuY2VsKSB7XG4gICAgY29uc3QgZWxlbWVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIC8qKiBAdHlwZSB7KE5vZGV8V2luZG93KVtdfSAqL1xuICAgIGxldCBlbHRzVG9MaXN0ZW5PblxuICAgIGlmICh0cmlnZ2VyU3BlYy5mcm9tKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCB0cmlnZ2VyU3BlYy5mcm9tKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IFtlbHRdXG4gICAgfVxuICAgIC8vIHN0b3JlIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMsIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXkgY2hhbmdlXG4gICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uLmZvckVhY2goZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgfSlcbiAgICB9XG4gICAgZm9yRWFjaChlbHRzVG9MaXN0ZW5PbiwgZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGVsdFRvTGlzdGVuT24ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBsaWNpdENhbmNlbCB8fCBzaG91bGRDYW5jZWwoZXZ0LCBlbHQpKSB7XG4gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2dClcbiAgICAgICAgZXZlbnREYXRhLnRyaWdnZXJTcGVjID0gdHJpZ2dlclNwZWNcbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yID09IG51bGwpIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvciA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yLmluZGV4T2YoZWx0KSA8IDApIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvci5wdXNoKGVsdClcbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY29uc3VtZSkge1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50YXJnZXQgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKGFzRWxlbWVudChldnQudGFyZ2V0KSwgdHJpZ2dlclNwZWMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLm9uY2UpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgICAgICAgaWYgKGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEuZGVsYXllZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVsZW1lbnREYXRhLmRlbGF5ZWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocm90dGxlID4gMCkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gbnVsbFxuICAgICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy50aHJvdHRsZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLmRlbGF5ID4gMCkge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZGVsYXllZCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub2RlRGF0YS5saXN0ZW5lckluZm9zID09IG51bGwpIHtcbiAgICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcyA9IFtdXG4gICAgICB9XG4gICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyU3BlYy50cmlnZ2VyLFxuICAgICAgICBsaXN0ZW5lcjogZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgb246IGVsdFRvTGlzdGVuT25cbiAgICAgIH0pXG4gICAgICBlbHRUb0xpc3Rlbk9uLmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICB9KVxuICB9XG5cbiAgbGV0IHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2UgLy8gdXNlZCBieSBpbml0U2Nyb2xsSGFuZGxlclxuICBsZXQgc2Nyb2xsSGFuZGxlciA9IG51bGxcbiAgZnVuY3Rpb24gaW5pdFNjcm9sbEhhbmRsZXIoKSB7XG4gICAgaWYgKCFzY3JvbGxIYW5kbGVyKSB7XG4gICAgICBzY3JvbGxIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgICAgfVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpXG4gICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHdpbmRvd0lzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgICAgICAgIGZvckVhY2goZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXIqPSdyZXZlYWxlZCddLFtkYXRhLWh4LXRyaWdnZXIqPSdyZXZlYWxlZCddXCIpLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIG1heWJlUmV2ZWFsKGVsdClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVJldmVhbChlbHQpIHtcbiAgICBpZiAoIWhhc0F0dHJpYnV0ZShlbHQsICdkYXRhLWh4LXJldmVhbGVkJykgJiYgaXNTY3JvbGxlZEludG9WaWV3KGVsdCkpIHtcbiAgICAgIGVsdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaHgtcmV2ZWFsZWQnLCAndHJ1ZScpXG4gICAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAobm9kZURhdGEuaW5pdEhhc2gpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZSBub2RlIGlzbid0IGluaXRpYWxpemVkLCB3YWl0IGZvciBpdCBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgcmVxdWVzdFxuICAgICAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphZnRlclByb2Nlc3NOb2RlJywgZnVuY3Rpb24oKSB7IHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpIH0sIHsgb25jZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5XG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSW1tZWRpYXRlbHkoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgZGVsYXkpIHtcbiAgICBjb25zdCBsb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW5vZGVEYXRhLmxvYWRlZCkge1xuICAgICAgICBub2RlRGF0YS5sb2FkZWQgPSB0cnVlXG4gICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGxvYWQsIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGxldCBleHBsaWNpdEFjdGlvbiA9IGZhbHNlXG4gICAgZm9yRWFjaChWRVJCUywgZnVuY3Rpb24odmVyYikge1xuICAgICAgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC0nICsgdmVyYikpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LScgKyB2ZXJiKVxuICAgICAgICBleHBsaWNpdEFjdGlvbiA9IHRydWVcbiAgICAgICAgbm9kZURhdGEucGF0aCA9IHBhdGhcbiAgICAgICAgbm9kZURhdGEudmVyYiA9IHZlcmJcbiAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGV4cGxpY2l0QWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQGNhbGxiYWNrIFRyaWdnZXJIYW5kbGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IFtldnRdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKi9cbiAgZnVuY3Rpb24gYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGhhbmRsZXIpIHtcbiAgICBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ3JldmVhbGVkJykge1xuICAgICAgaW5pdFNjcm9sbEhhbmRsZXIoKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICAgIG1heWJlUmV2ZWFsKGFzRWxlbWVudChlbHQpKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2ludGVyc2VjdCcpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyT3B0aW9ucyA9IHt9XG4gICAgICBpZiAodHJpZ2dlclNwZWMucm9vdCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMucm9vdCA9IHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0cmlnZ2VyU3BlYy5yb290KVxuICAgICAgfVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocmVzaG9sZCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMudGhyZXNob2xkID0gcGFyc2VGbG9hdCh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpXG4gICAgICB9XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlbnRyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXVxuICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2ludGVyc2VjdCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgb2JzZXJ2ZXJPcHRpb25zKVxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShhc0VsZW1lbnQoZWx0KSlcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdsb2FkJykge1xuICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIG1ha2VFdmVudCgnbG9hZCcsIHsgZWx0IH0pKSkge1xuICAgICAgICBsb2FkSW1tZWRpYXRlbHkoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnBvbGxJbnRlcnZhbCA+IDApIHtcbiAgICAgIG5vZGVEYXRhLnBvbGxpbmcgPSB0cnVlXG4gICAgICBwcm9jZXNzUG9sbGluZyhhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3NIeE9uKG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbHQuYXR0cmlidXRlc1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdLm5hbWVcbiAgICAgIGlmIChzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb246JykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb246JykgfHxcbiAgICAgICAgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uLScpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uLScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBjb25zdCBIWF9PTl9RVUVSWSA9IG5ldyBYUGF0aEV2YWx1YXRvcigpXG4gICAgLmNyZWF0ZUV4cHJlc3Npb24oJy4vLypbQCpbIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbjpcIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb246XCIpIG9yJyArXG4gICAgICAnIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbi1cIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb24tXCIpIF1dJylcblxuICBmdW5jdGlvbiBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cykge1xuICAgIGlmIChzaG91bGRQcm9jZXNzSHhPbihlbHQpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChlbHQpKVxuICAgIH1cbiAgICBjb25zdCBpdGVyID0gSFhfT05fUVVFUlkuZXZhbHVhdGUoZWx0KVxuICAgIGxldCBub2RlID0gbnVsbFxuICAgIHdoaWxlIChub2RlID0gaXRlci5pdGVyYXRlTmV4dCgpKSBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChub2RlKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpIHtcbiAgICAvKiogQHR5cGUge0VsZW1lbnRbXX0gKi9cbiAgICBjb25zdCBlbGVtZW50cyA9IFtdXG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWx0LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgcHJvY2Vzc0hYT25Sb290KGNoaWxkLCBlbGVtZW50cylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpXG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCkge1xuICAgIGlmIChlbHQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgY29uc3QgYm9vc3RlZFNlbGVjdG9yID0gJywgW2h4LWJvb3N0XSBhLCBbZGF0YS1oeC1ib29zdF0gYSwgYVtoeC1ib29zdF0sIGFbZGF0YS1oeC1ib29zdF0nXG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvblNlbGVjdG9ycyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGUgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2VdXG4gICAgICAgIGlmIChleHRlbnNpb24uZ2V0U2VsZWN0b3JzKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMoKVxuICAgICAgICAgIGlmIChzZWxlY3RvcnMpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvblNlbGVjdG9ycy5wdXNoKHNlbGVjdG9ycylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGVsdC5xdWVyeVNlbGVjdG9yQWxsKFZFUkJfU0VMRUNUT1IgKyBib29zdGVkU2VsZWN0b3IgKyBcIiwgZm9ybSwgW3R5cGU9J3N1Ym1pdCddLFwiICtcbiAgICAgICAgJyBbaHgtZXh0XSwgW2RhdGEtaHgtZXh0XSwgW2h4LXRyaWdnZXJdLCBbZGF0YS1oeC10cmlnZ2VyXScgKyBleHRlbnNpb25TZWxlY3RvcnMuZmxhdCgpLm1hcChzID0+ICcsICcgKyBzKS5qb2luKCcnKSlcblxuICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICogc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gKi8gKGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIikpXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBlbHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIilcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGZvcm0gPSByZXNvbHZlVGFyZ2V0KCcjJyArIGdldFJhd0F0dHJpYnV0ZShlbHQsICdmb3JtJyksIGVsdC5nZXRSb290Tm9kZSgpKSB8fCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKVxuICAgIGlmICghZm9ybSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXRCdXR0b25UcmFja2luZyhlbHQpIHtcbiAgICAvLyBuZWVkIHRvIGhhbmRsZSBib3RoIGNsaWNrIGFuZCBmb2N1cyBpbjpcbiAgICAvLyAgIGZvY3VzaW4gLSBpbiBjYXNlIHNvbWVvbmUgdGFicyBpbiB0byBhIGJ1dHRvbiBhbmQgaGl0cyB0aGUgc3BhY2UgYmFyXG4gICAgLy8gICBjbGljayAtIG9uIE9TWCBidXR0b25zIGRvIG5vdCBmb2N1cyBvbiBjbGljayBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzI0XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGVcbiAgICovXG4gIGZ1bmN0aW9uIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIGNvZGUpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGVEYXRhLm9uSGFuZGxlcnMpKSB7XG4gICAgICBub2RlRGF0YS5vbkhhbmRsZXJzID0gW11cbiAgICB9XG4gICAgbGV0IGZ1bmNcbiAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICBmdW5jID0gbmV3IEZ1bmN0aW9uKCdldmVudCcsIGNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgZnVuYy5jYWxsKGVsdCwgZSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgbm9kZURhdGEub25IYW5kbGVycy5wdXNoKHsgZXZlbnQ6IGV2ZW50TmFtZSwgbGlzdGVuZXIgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0h4T25XaWxkY2FyZChlbHQpIHtcbiAgICAvLyB3aXBlIGFueSBwcmV2aW91cyBvbiBoYW5kbGVycyBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMgcHJlY2VkZW5jZVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWx0KVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGNvbnN0IHZhbHVlID0gZWx0LmF0dHJpYnV0ZXNbaV0udmFsdWVcbiAgICAgIGlmIChzdGFydHNXaXRoKG5hbWUsICdoeC1vbicpIHx8IHN0YXJ0c1dpdGgobmFtZSwgJ2RhdGEtaHgtb24nKSkge1xuICAgICAgICBjb25zdCBhZnRlck9uUG9zaXRpb24gPSBuYW1lLmluZGV4T2YoJy1vbicpICsgM1xuICAgICAgICBjb25zdCBuZXh0Q2hhciA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uLCBhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICBpZiAobmV4dENoYXIgPT09ICctJyB8fCBuZXh0Q2hhciA9PT0gJzonKSB7XG4gICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgICAvLyBpZiB0aGUgZXZlbnROYW1lIHN0YXJ0cyB3aXRoIGEgY29sb24gb3IgZGFzaCwgcHJlcGVuZCBcImh0bXhcIiBmb3Igc2hvcnRoYW5kIHN1cHBvcnRcbiAgICAgICAgICBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICc6JykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14JyArIGV2ZW50TmFtZVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICctJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoMSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnaHRteC0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSg1KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXROb2RlKGVsdCkge1xuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAobm9kZURhdGEuaW5pdEhhc2ggIT09IGF0dHJpYnV0ZUhhc2goZWx0KSkge1xuICAgICAgLy8gY2xlYW4gdXAgYW55IHByZXZpb3VzbHkgcHJvY2Vzc2VkIGluZm9cbiAgICAgIGRlSW5pdE5vZGUoZWx0KVxuXG4gICAgICBub2RlRGF0YS5pbml0SGFzaCA9IGF0dHJpYnV0ZUhhc2goZWx0KVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpXG5cbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgaWYgKGVsdC52YWx1ZSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG5vZGVEYXRhLmxhc3RWYWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBnZXRUcmlnZ2VyU3BlY3MoZWx0KVxuICAgICAgY29uc3QgaGFzRXhwbGljaXRIdHRwQWN0aW9uID0gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcblxuICAgICAgaWYgKCFoYXNFeHBsaWNpdEh0dHBBY3Rpb24pIHtcbiAgICAgICAgaWYgKGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1ib29zdCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuICAgICAgICB9IGVsc2UgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC10cmlnZ2VyJykpIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgICAgLy8gRm9yIFwibmFrZWRcIiB0cmlnZ2VycywgZG9uJ3QgZG8gYW55dGhpbmcgYXQgYWxsXG4gICAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nIHx8IChnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JyAmJiBoYXNBdHRyaWJ1dGUoZWx0LCAnZm9ybScpKSkge1xuICAgICAgICBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclByb2Nlc3NOb2RlJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIG5ldyBjb250ZW50LCBlbmFibGluZyBodG14IGJlaGF2aW9yLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgY29udGVudCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBET00gb3V0c2lkZSBvZiB0aGUgbm9ybWFsIGh0bXggcmVxdWVzdCBjeWNsZSBidXQgc3RpbGwgd2FudCBodG14IGF0dHJpYnV0ZXMgdG8gd29yay5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcHJvY2Vzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgZWxlbWVudCB0byBwcm9jZXNzXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShlbHQpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpbml0Tm9kZShlbHQpXG4gICAgZm9yRWFjaChmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSwgZnVuY3Rpb24oY2hpbGQpIHsgaW5pdE5vZGUoY2hpbGQpIH0pXG4gICAgZm9yRWFjaChmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSwgcHJvY2Vzc0h4T25XaWxkY2FyZClcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV2ZW50L0xvZyBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRldGFpbFxuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgLy8gVGhpcyBicmVha3MgZXhwZWN0ZWQgZW5jYXBzdWxhdGlvbiBidXQgbmVlZHMgdG8gYmUgaGVyZSB1bnRpbCBkZWNpZGVkIG90aGVyd2lzZSBieSBjb3JlIGRldnNcbiAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBldnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsXG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXJyb3JFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZXZlbnROYW1lIH0sIGRldGFpbCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpIHtcbiAgICByZXR1cm4gZXZlbnROYW1lID09PSAnaHRteDphZnRlclByb2Nlc3NOb2RlJ1xuICB9XG5cbiAgLyoqXG4gICAqIGB3aXRoRXh0ZW5zaW9uc2AgbG9jYXRlcyBhbGwgYWN0aXZlIGV4dGVuc2lvbnMgZm9yIGEgcHJvdmlkZWQgZWxlbWVudCwgdGhlblxuICAgKiBleGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdXNpbmcgZWFjaCBvZiB0aGUgYWN0aXZlIGV4dGVuc2lvbnMuICBJdCBzaG91bGRcbiAgICogYmUgY2FsbGVkIGludGVybmFsbHkgYXQgZXZlcnkgZXh0ZW5kYWJsZSBleGVjdXRpb24gcG9pbnQgaW4gaHRteC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHsoZXh0ZW5zaW9uOkh0bXhFeHRlbnNpb24pID0+IHZvaWR9IHRvRG9cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aEV4dGVuc2lvbnMoZWx0LCB0b0RvKSB7XG4gICAgZm9yRWFjaChnZXRFeHRlbnNpb25zKGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9EbyhleHRlbnNpb24pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ0Vycm9yKG1zZykge1xuICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1zZylcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICBjb25zb2xlLmxvZygnRVJST1I6ICcsIG1zZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBnaXZlbiBldmVudCBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RyaWdnZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byB0cmlnZ2VyXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsIGRldGFpbHMgZm9yIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRldGFpbCA9PSBudWxsKSB7XG4gICAgICBkZXRhaWwgPSB7fVxuICAgIH1cbiAgICBkZXRhaWwuZWx0ID0gZWx0XG4gICAgY29uc3QgZXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgaWYgKGh0bXgubG9nZ2VyICYmICFpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSkge1xuICAgICAgaHRteC5sb2dnZXIoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICB9XG4gICAgaWYgKGRldGFpbC5lcnJvcikge1xuICAgICAgbG9nRXJyb3IoZGV0YWlsLmVycm9yKVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6ZXJyb3InLCB7IGVycm9ySW5mbzogZGV0YWlsIH0pXG4gICAgfVxuICAgIGxldCBldmVudFJlc3VsdCA9IGVsdC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGtlYmFiTmFtZSA9IGtlYmFiRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAgICBpZiAoZXZlbnRSZXN1bHQgJiYga2ViYWJOYW1lICE9PSBldmVudE5hbWUpIHtcbiAgICAgIGNvbnN0IGtlYmFiZWRFdmVudCA9IG1ha2VFdmVudChrZWJhYk5hbWUsIGV2ZW50LmRldGFpbClcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgZWx0LmRpc3BhdGNoRXZlbnQoa2ViYWJlZEV2ZW50KVxuICAgIH1cbiAgICB3aXRoRXh0ZW5zaW9ucyhhc0VsZW1lbnQoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIChleHRlbnNpb24ub25FdmVudChldmVudE5hbWUsIGV2ZW50KSAhPT0gZmFsc2UgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgfSlcbiAgICByZXR1cm4gZXZlbnRSZXN1bHRcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhpc3RvcnkgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsZXQgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAvKipcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRIaXN0b3J5RWxlbWVudCgpIHtcbiAgICBjb25zdCBoaXN0b3J5RWx0ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpXG4gICAgcmV0dXJuIGhpc3RvcnlFbHQgfHwgZ2V0RG9jdW1lbnQoKS5ib2R5XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbHRcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVUb0hpc3RvcnlDYWNoZSh1cmwsIHJvb3RFbHQpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgc3RhdGUgdG8gc2F2ZVxuICAgIGNvbnN0IGlubmVySFRNTCA9IGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShyb290RWx0KVxuICAgIGNvbnN0IHRpdGxlID0gZ2V0RG9jdW1lbnQoKS50aXRsZVxuICAgIGNvbnN0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSA8PSAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbiBldmVudHVhbGx5IGFscmVhZHkgZXhpc3RpbmcgY2FjaGUgaXMgcHVyZ2VkXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICBoaXN0b3J5Q2FjaGUuc3BsaWNlKGksIDEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIEh0bXhIaXN0b3J5SXRlbSAqL1xuICAgIGNvbnN0IG5ld0hpc3RvcnlJdGVtID0geyB1cmwsIGNvbnRlbnQ6IGlubmVySFRNTCwgdGl0bGUsIHNjcm9sbCB9XG5cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5SXRlbUNyZWF0ZWQnLCB7IGl0ZW06IG5ld0hpc3RvcnlJdGVtLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG5cbiAgICBoaXN0b3J5Q2FjaGUucHVzaChuZXdIaXN0b3J5SXRlbSlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUpIHtcbiAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpXG4gICAgfVxuXG4gICAgLy8ga2VlcCB0cnlpbmcgdG8gc2F2ZSB0aGUgY2FjaGUgdW50aWwgaXQgc3VjY2VlZHMgb3IgaXMgZW1wdHlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5Q2FjaGUpKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZUVycm9yJywgeyBjYXVzZTogZSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuICAgICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKSAvLyBzaHJpbmsgdGhlIGNhY2hlIGFuZCByZXRyeVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeUl0ZW1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNjcm9sbFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcmV0dXJucyB7SHRteEhpc3RvcnlJdGVtfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDYWNoZWRIaXN0b3J5KHVybCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIHJldHVybiBoaXN0b3J5Q2FjaGVbaV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KGVsdCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGh0bXguY29uZmlnLnJlcXVlc3RDbGFzc1xuICAgIGNvbnN0IGNsb25lID0gLyoqIEB0eXBlIEVsZW1lbnQgKi8gKGVsdC5jbG9uZU5vZGUodHJ1ZSkpXG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnLicgKyBjbGFzc05hbWUpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhc3NOYW1lKVxuICAgIH0pXG4gICAgLy8gcmVtb3ZlIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgZm9yIGFueSBlbGVtZW50IGRpc2FibGVkIGR1ZSB0byBhbiBodG14IHJlcXVlc3RcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICdbZGF0YS1kaXNhYmxlZC1ieS1odG14XScpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgfSlcbiAgICByZXR1cm4gY2xvbmUuaW5uZXJIVE1MXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKSB7XG4gICAgY29uc3QgZWx0ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50UGF0aEZvckhpc3RvcnkgfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAgIC8vIEFsbG93IGhpc3Rvcnkgc25hcHNob3QgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCB3aGVyZSBoeC1oaXN0b3J5PVwiZmFsc2VcIlxuICAgIC8vIGlzIHByZXNlbnQgKmFueXdoZXJlKiBpbiB0aGUgY3VycmVudCBkb2N1bWVudCB3ZSdyZSBhYm91dCB0byBzYXZlLFxuICAgIC8vIHNvIHdlIGNhbiBwcmV2ZW50IHByaXZpbGVnZWQgZGF0YSBlbnRlcmluZyB0aGUgY2FjaGUuXG4gICAgLy8gVGhlIHBhZ2Ugd2lsbCBzdGlsbCBiZSByZWFjaGFibGUgYXMgYSBoaXN0b3J5IGVudHJ5LCBidXQgaHRteCB3aWxsIGZldGNoIGl0XG4gICAgLy8gbGl2ZSBmcm9tIHRoZSBzZXJ2ZXIgb25wb3BzdGF0ZSByYXRoZXIgdGhhbiBsb29rIGluIHRoZSBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICBsZXQgZGlzYWJsZUhpc3RvcnlDYWNoZVxuICAgIHRyeSB7XG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0nKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJRTExOiBpbnNlbnNpdGl2ZSBtb2RpZmllciBub3Qgc3VwcG9ydGVkIHNvIGZhbGxiYWNrIHRvIGNhc2Ugc2Vuc2l0aXZlIHNlbGVjdG9yXG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCJdLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiXScpXG4gICAgfVxuICAgIGlmICghZGlzYWJsZUhpc3RvcnlDYWNoZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVNhdmUnLCB7IHBhdGgsIGhpc3RvcnlFbHQ6IGVsdCB9KVxuICAgICAgc2F2ZVRvSGlzdG9yeUNhY2hlKHBhdGgsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCBnZXREb2N1bWVudCgpLnRpdGxlLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcHVzaFVybEludG9IaXN0b3J5KHBhdGgpIHtcbiAgLy8gcmVtb3ZlIHRoZSBjYWNoZSBidXN0ZXIgcGFyYW1ldGVyLCBpZiBhbnlcbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvb3JnXFwuaHRteFxcLmNhY2hlLWJ1c3Rlcj1bXiZdKiY/LywgJycpXG4gICAgICBpZiAoZW5kc1dpdGgocGF0aCwgJyYnKSB8fCBlbmRzV2l0aChwYXRoLCAnPycpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIHtcbiAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICB9XG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlVXJsSW5IaXN0b3J5KHBhdGgpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0dGxlSW1tZWRpYXRlbHkodGFza3MpIHtcbiAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICB0YXNrLmNhbGwodW5kZWZpbmVkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgY29uc3QgZGV0YWlscyA9IHsgcGF0aCwgeGhyOiByZXF1ZXN0IH1cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzJywgZGV0YWlscylcbiAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1DdXJyZW50LVVSTCcsIGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZilcbiAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZCcsIGRldGFpbHMpXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KHRoaXMucmVzcG9uc2UpXG4gICAgICAgIC8qKiBAdHlwZSBQYXJlbnROb2RlICovXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpIHx8IGZyYWdtZW50XG4gICAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuXG4gICAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGNvbnRlbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGNhY2hlTWlzczogdHJ1ZSwgc2VydmVyUmVzcG9uc2U6IHRoaXMucmVzcG9uc2UgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWRFcnJvcicsIGRldGFpbHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3Quc2VuZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzdG9yZUhpc3RvcnkocGF0aCkge1xuICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgcGF0aCA9IHBhdGggfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRIaXN0b3J5KHBhdGgpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY2FjaGVkLmNvbnRlbnQpXG4gICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGNhY2hlZC5zY3JvbGwpXG4gICAgICB9LCAwKSAvLyBuZXh0ICd0aWNrJywgc28gYnJvd3NlciBoYXMgdGltZSB0byByZW5kZXIgbGF5b3V0XG4gICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgaXRlbTogY2FjaGVkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5yZWZyZXNoT25IaXN0b3J5TWlzcykge1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gcmVsb2FkKCkgZnVuY3Rpb24gdGhyb3dzIGVycm9yXG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpIHtcbiAgICBsZXQgaW5kaWNhdG9ycyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluZGljYXRvcicpKVxuICAgIGlmIChpbmRpY2F0b3JzID09IG51bGwpIHtcbiAgICAgIGluZGljYXRvcnMgPSBbZWx0XVxuICAgIH1cbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBpYy5jbGFzc0xpc3QuYWRkLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgfSlcbiAgICByZXR1cm4gaW5kaWNhdG9yc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBkaXNhYmxlRWxlbWVudHMoZWx0KSB7XG4gICAgbGV0IGRpc2FibGVkRWx0cyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWRpc2FibGVkLWVsdCcpKVxuICAgIGlmIChkaXNhYmxlZEVsdHMgPT0gbnVsbCkge1xuICAgICAgZGlzYWJsZWRFbHRzID0gW11cbiAgICB9XG4gICAgZm9yRWFjaChkaXNhYmxlZEVsdHMsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnLCAnJylcbiAgICB9KVxuICAgIHJldHVybiBkaXNhYmxlZEVsdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gaW5kaWNhdG9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVkKSB7XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgaWMuY2xhc3NMaXN0LnJlbW92ZS5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChkaXNhYmxlZCwgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnB1dCBWYWx1ZSBQcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IHByb2Nlc3NlZFtpXVxuICAgICAgaWYgKG5vZGUuaXNTYW1lTm9kZShlbHQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkSW5jbHVkZShlbGVtZW50KSB7XG4gICAgLy8gQ2FzdCB0byB0cmljayB0c2MsIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCB3b3JrIGZpbmUgaGVyZVxuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudH0gKi8gKGVsZW1lbnQpXG4gICAgaWYgKGVsdC5uYW1lID09PSAnJyB8fCBlbHQubmFtZSA9PSBudWxsIHx8IGVsdC5kaXNhYmxlZCB8fCBjbG9zZXN0KGVsdCwgJ2ZpZWxkc2V0W2Rpc2FibGVkXScpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgLy8gaWdub3JlIFwic3VibWl0dGVyXCIgdHlwZXMgKHNlZSBqUXVlcnkgc3JjL3NlcmlhbGl6ZS5qcylcbiAgICBpZiAoZWx0LnR5cGUgPT09ICdidXR0b24nIHx8IGVsdC50eXBlID09PSAnc3VibWl0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ltYWdlJyB8fCBlbHQudGFnTmFtZSA9PT0gJ3Jlc2V0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGVsdC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsdC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm4gZWx0LmNoZWNrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheXxGb3JtRGF0YUVudHJ5VmFsdWV9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxldCB2YWx1ZXMgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdmFsdWUuaW5kZXhPZih2KSA8IDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpXG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgIGZvckVhY2godmFsdWVzLCB2ID0+IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudHxIVE1MU2VsZWN0RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpIHtcbiAgICBpZiAoZWx0ID09IG51bGwgfHwgaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NlZC5wdXNoKGVsdClcbiAgICB9XG4gICAgaWYgKHNob3VsZEluY2x1ZGUoZWx0KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJylcbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgbGV0IHZhbHVlID0gZWx0LnZhbHVlXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgZWx0Lm11bHRpcGxlKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uOmNoZWNrZWQnKSkubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuICgvKiogQHR5cGUgSFRNTE9wdGlvbkVsZW1lbnQgKi8oZSkpLnZhbHVlIH0pXG4gICAgICB9XG4gICAgICAvLyBpbmNsdWRlIGZpbGUgaW5wdXRzXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbHQuZmlsZXMpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5maWxlcylcbiAgICAgIH1cbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGVsdC5lbGVtZW50cywgZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHByb2Nlc3NlZC5pbmRleE9mKGlucHV0KSA+PSAwKSB7XG4gICAgICAgICAgLy8gVGhlIGlucHV0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZCBhZGRlZCB0byB0aGUgdmFsdWVzLCBidXQgdGhlIEZvcm1EYXRhIHRoYXQgd2lsbCBiZVxuICAgICAgICAgIC8vICBjb25zdHJ1Y3RlZCByaWdodCBhZnRlciBvbiB0aGUgZm9ybSwgd2lsbCBpbmNsdWRlIGl0IG9uY2UgYWdhaW4uIFNvIHJlbW92ZSB0aGF0IGlucHV0J3MgdmFsdWVcbiAgICAgICAgICAvLyAgbm93IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShpbnB1dC5uYW1lLCBpbnB1dC52YWx1ZSwgZm9ybURhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1c2goaW5wdXQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgICAgdmFsaWRhdGVFbGVtZW50KGlucHV0LCBlcnJvcnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBuZXcgRm9ybURhdGEoZWx0KS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgJiYgdmFsdWUubmFtZSA9PT0gJycpIHtcbiAgICAgICAgICByZXR1cm4gLy8gaWdub3JlIG5vLW5hbWUgZmlsZXNcbiAgICAgICAgfVxuICAgICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICovXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50ICYgRWxlbWVudEludGVybmFsc30gKi8gKGVsdClcbiAgICBpZiAoZWxlbWVudC53aWxsVmFsaWRhdGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOnZhbGlkYXRlJylcbiAgICAgIGlmICghZWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBlbHQ6IGVsZW1lbnQsIG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOmZhaWxlZCcsIHsgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBvbmUgRm9ybURhdGEgd2l0aCB0aG9zZSBmcm9tIGFub3RoZXIuXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IHJlY2VpdmVyIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBkb25vciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIG92ZXJyaWRpbmcgdmFsdWVzXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX0gdGhlIHtAbGlua2NvZGUgcmVjZWl2ZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvdmVycmlkZUZvcm1EYXRhKHJlY2VpdmVyLCBkb25vcikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGRvbm9yLmtleXMoKSkge1xuICAgICAgcmVjZWl2ZXIuZGVsZXRlKGtleSlcbiAgICB9XG4gICAgZG9ub3IuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZWNlaXZlci5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZWNlaXZlclxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEByZXR1cm5zIHt7ZXJyb3JzOiBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdLCBmb3JtRGF0YTogRm9ybURhdGEsIHZhbHVlczogT2JqZWN0fX1cbiAqL1xuICBmdW5jdGlvbiBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpIHtcbiAgICAvKiogQHR5cGUgRWxlbWVudFtdICovXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gW11cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgY29uc3QgcHJpb3JpdHlGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgLyoqIEB0eXBlIEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCAmJiAhYm9keUNvbnRhaW5zKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBvbmx5IHZhbGlkYXRlIHdoZW4gZm9ybSBpcyBkaXJlY3RseSBzdWJtaXR0ZWQgYW5kIG5vdmFsaWRhdGUgb3IgZm9ybW5vdmFsaWRhdGUgYXJlIG5vdCBzZXRcbiAgICAvLyBvciBpZiB0aGUgZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgaHgtdmFsaWRhdGU9XCJ0cnVlXCIgb24gaXRcbiAgICBsZXQgdmFsaWRhdGUgPSAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmIGVsdC5ub1ZhbGlkYXRlICE9PSB0cnVlKSB8fCBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC12YWxpZGF0ZScpID09PSAndHJ1ZSdcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSB7XG4gICAgICB2YWxpZGF0ZSA9IHZhbGlkYXRlICYmIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZC5mb3JtTm9WYWxpZGF0ZSAhPT0gdHJ1ZVxuICAgIH1cblxuICAgIC8vIGZvciBhIG5vbi1HRVQgaW5jbHVkZSB0aGUgY2xvc2VzdCBmb3JtXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIHByaW9yaXR5Rm9ybURhdGEsIGVycm9ycywgY2xvc2VzdChlbHQsICdmb3JtJyksIHZhbGlkYXRlKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKVxuXG4gICAgLy8gaWYgYSBidXR0b24gb3Igc3VibWl0IHdhcyBjbGlja2VkIGxhc3QsIGluY2x1ZGUgaXRzIHZhbHVlXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCBlbHQudGFnTmFtZSA9PT0gJ0JVVFRPTicgfHxcbiAgICAoZWx0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcpKSB7XG4gICAgICBjb25zdCBidXR0b24gPSBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgKC8qKiBAdHlwZSBIVE1MSW5wdXRFbGVtZW50fEhUTUxCdXR0b25FbGVtZW50ICovKGVsdCkpXG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGJ1dHRvbiwgJ25hbWUnKVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIGJ1dHRvbi52YWx1ZSwgcHJpb3JpdHlGb3JtRGF0YSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIGFueSBleHBsaWNpdCBpbmNsdWRlc1xuICAgIGNvbnN0IGluY2x1ZGVzID0gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5jbHVkZScpXG4gICAgZm9yRWFjaChpbmNsdWRlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBhc0VsZW1lbnQobm9kZSksIHZhbGlkYXRlKVxuICAgICAgLy8gaWYgYSBub24tZm9ybSBpcyBpbmNsdWRlZCwgaW5jbHVkZSBhbnkgaW5wdXQgdmFsdWVzIHdpdGhpbiBpdFxuICAgICAgaWYgKCFtYXRjaGVzKG5vZGUsICdmb3JtJykpIHtcbiAgICAgICAgZm9yRWFjaChhc1BhcmVudE5vZGUobm9kZSkucXVlcnlTZWxlY3RvckFsbChJTlBVVF9TRUxFQ1RPUiksIGZ1bmN0aW9uKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGRlc2NlbmRhbnQsIHZhbGlkYXRlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyB2YWx1ZXMgZnJvbSBhIDxmb3JtPiB0YWtlIHByZWNlZGVuY2UsIG92ZXJyaWRpbmcgdGhlIHJlZ3VsYXIgdmFsdWVzXG4gICAgb3ZlcnJpZGVGb3JtRGF0YShmb3JtRGF0YSwgcHJpb3JpdHlGb3JtRGF0YSlcblxuICAgIHJldHVybiB7IGVycm9ycywgZm9ybURhdGEsIHZhbHVlczogZm9ybURhdGFQcm94eShmb3JtRGF0YSkgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXR1cm5TdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHthbnl9IHJlYWxWYWx1ZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBuYW1lLCByZWFsVmFsdWUpIHtcbiAgICBpZiAocmV0dXJuU3RyICE9PSAnJykge1xuICAgICAgcmV0dXJuU3RyICs9ICcmJ1xuICAgIH1cbiAgICBpZiAoU3RyaW5nKHJlYWxWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZWFsVmFsdWUgPSBKU09OLnN0cmluZ2lmeShyZWFsVmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IHMgPSBlbmNvZGVVUklDb21wb25lbnQocmVhbFZhbHVlKVxuICAgIHJldHVyblN0ciArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBzXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF8T2JqZWN0fSB2YWx1ZXNcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBmdW5jdGlvbiB1cmxFbmNvZGUodmFsdWVzKSB7XG4gICAgdmFsdWVzID0gZm9ybURhdGFGcm9tT2JqZWN0KHZhbHVlcylcbiAgICBsZXQgcmV0dXJuU3RyID0gJydcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm5TdHIgPSBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBamF4XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9tcHRcbiAqIEByZXR1cm5zIHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHQpIHtcbiAgICAvKiogQHR5cGUgSHRteEhlYWRlclNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgJ0hYLVJlcXVlc3QnOiAndHJ1ZScsXG4gICAgICAnSFgtVHJpZ2dlcic6IGdldFJhd0F0dHJpYnV0ZShlbHQsICdpZCcpLFxuICAgICAgJ0hYLVRyaWdnZXItTmFtZSc6IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJyksXG4gICAgICAnSFgtVGFyZ2V0JzogZ2V0QXR0cmlidXRlVmFsdWUodGFyZ2V0LCAnaWQnKSxcbiAgICAgICdIWC1DdXJyZW50LVVSTCc6IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cbiAgICBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LWhlYWRlcnMnLCBmYWxzZSwgaGVhZGVycylcbiAgICBpZiAocHJvbXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLVByb21wdCddID0gcHJvbXB0XG4gICAgfVxuICAgIGlmIChnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Cb29zdGVkJ10gPSAndHJ1ZSdcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIC8qKlxuICogZmlsdGVyVmFsdWVzIHRha2VzIGFuIG9iamVjdCBjb250YWluaW5nIGZvcm0gaW5wdXQgdmFsdWVzXG4gKiBhbmQgcmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBvbmx5IGNvbnRhaW5zIGtleXMgdGhhdCBhcmVcbiAqIHNwZWNpZmllZCBieSB0aGUgY2xvc2VzdCBcImh4LXBhcmFtc1wiIGF0dHJpYnV0ZVxuICogQHBhcmFtIHtGb3JtRGF0YX0gaW5wdXRWYWx1ZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZmlsdGVyVmFsdWVzKGlucHV0VmFsdWVzLCBlbHQpIHtcbiAgICBjb25zdCBwYXJhbXNWYWx1ZSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wYXJhbXMnKVxuICAgIGlmIChwYXJhbXNWYWx1ZSkge1xuICAgICAgaWYgKHBhcmFtc1ZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlLmluZGV4T2YoJ25vdCAnKSA9PT0gMCkge1xuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnN1YnN0cig0KS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaW5wdXRWYWx1ZXMuZGVsZXRlKG5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaWYgKGlucHV0VmFsdWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZXMuZ2V0QWxsKG5hbWUpLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHsgbmV3VmFsdWVzLmFwcGVuZChuYW1lLCB2YWx1ZSkgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBuZXdWYWx1ZXNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0FuY2hvckxpbmsoZWx0KSB7XG4gICAgcmV0dXJuICEhZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSA+PSAwXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IFtzd2FwSW5mb092ZXJyaWRlXVxuICogQHJldHVybnMge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBJbmZvT3ZlcnJpZGUpIHtcbiAgICBjb25zdCBzd2FwSW5mbyA9IHN3YXBJbmZvT3ZlcnJpZGUgfHwgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN3YXAnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBzd2FwU3BlYyA9IHtcbiAgICAgIHN3YXBTdHlsZTogZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCA/ICdpbm5lckhUTUwnIDogaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSxcbiAgICAgIHN3YXBEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFN3YXBEZWxheSxcbiAgICAgIHNldHRsZURlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U2V0dGxlRGVsYXlcbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLnNjcm9sbEludG9WaWV3T25Cb29zdCAmJiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmICFpc0FuY2hvckxpbmsoZWx0KSkge1xuICAgICAgc3dhcFNwZWMuc2hvdyA9ICd0b3AnXG4gICAgfVxuICAgIGlmIChzd2FwSW5mbykge1xuICAgICAgY29uc3Qgc3BsaXQgPSBzcGxpdE9uV2hpdGVzcGFjZShzd2FwSW5mbylcbiAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNwbGl0W2ldXG4gICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ3N3YXA6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDUpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2V0dGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zZXR0bGVEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDcpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZigndHJhbnNpdGlvbjonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMudHJhbnNpdGlvbiA9IHZhbHVlLnN1YnN0cigxMSkgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignaWdub3JlVGl0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gdmFsdWUuc3Vic3RyKDEyKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFNwZWMgPSB2YWx1ZS5zdWJzdHIoNylcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzY3JvbGxTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsID0gc2Nyb2xsVmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGxUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2hvdzonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2hvd1NwZWMgPSB2YWx1ZS5zdWJzdHIoNSlcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzaG93U3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzaG93VmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93ID0gc2hvd1ZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvd1RhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdmb2N1cy1zY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzU2Nyb2xsVmFsID0gdmFsdWUuc3Vic3RyKCdmb2N1cy1zY3JvbGw6Jy5sZW5ndGgpXG4gICAgICAgICAgICBzd2FwU3BlYy5mb2N1c1Njcm9sbCA9IGZvY3VzU2Nyb2xsVmFsID09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwU3R5bGUgPSB2YWx1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dFcnJvcignVW5rbm93biBtb2RpZmllciBpbiBoeC1zd2FwOiAnICsgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3BlY1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB1c2VzRm9ybURhdGEoZWx0KSB7XG4gICAgcmV0dXJuIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1lbmNvZGluZycpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfHxcbiAgICAobWF0Y2hlcyhlbHQsICdmb3JtJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2VuY3R5cGUnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmaWx0ZXJlZFBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgeyp8c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZFBhcmFtZXRlcnMpIHtcbiAgICBsZXQgZW5jb2RlZFBhcmFtZXRlcnMgPSBudWxsXG4gICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyA9PSBudWxsKSB7XG4gICAgICAgIGVuY29kZWRQYXJhbWV0ZXJzID0gZXh0ZW5zaW9uLmVuY29kZVBhcmFtZXRlcnMoeGhyLCBmaWx0ZXJlZFBhcmFtZXRlcnMsIGVsdClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5jb2RlZFBhcmFtZXRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbnZlcnNpb24gdG8gYW4gYWN0dWFsIEZvcm1EYXRhIG9iamVjdCBpbiBjYXNlIGZpbHRlcmVkUGFyYW1ldGVycyBpcyBhIGZvcm1EYXRhUHJveHlcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14L2lzc3Vlcy8yMzE3XG4gICAgICAgIHJldHVybiBvdmVycmlkZUZvcm1EYXRhKG5ldyBGb3JtRGF0YSgpLCBmb3JtRGF0YUZyb21PYmplY3QoZmlsdGVyZWRQYXJhbWV0ZXJzKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmxFbmNvZGUoZmlsdGVyZWRQYXJhbWV0ZXJzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7SHRteFNldHRsZUluZm99XG4gKi9cbiAgZnVuY3Rpb24gbWFrZVNldHRsZUluZm8odGFyZ2V0KSB7XG4gICAgcmV0dXJuIHsgdGFza3M6IFtdLCBlbHRzOiBbdGFyZ2V0XSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxTdGF0ZShjb250ZW50LCBzd2FwU3BlYykge1xuICAgIGNvbnN0IGZpcnN0ID0gY29udGVudFswXVxuICAgIGNvbnN0IGxhc3QgPSBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV1cbiAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbFRhcmdldCkge1xuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gMFxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gdGFyZ2V0LnNjcm9sbEhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3dhcFNwZWMuc2hvdykge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0KSB7XG4gICAgICAgIGxldCB0YXJnZXRTdHIgPSBzd2FwU3BlYy5zaG93VGFyZ2V0XG4gICAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0ID09PSAnd2luZG93Jykge1xuICAgICAgICAgIHRhcmdldFN0ciA9ICdib2R5J1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCB0YXJnZXRTdHIpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBldmFsQXNEZWZhdWx0XG4gKiBAcGFyYW0ge09iamVjdD19IHZhbHVlc1xuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICB2YWx1ZXMgPSB7fVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZXNcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgICBsZXQgc3RyID0gYXR0cmlidXRlVmFsdWUudHJpbSgpXG4gICAgICBsZXQgZXZhbHVhdGVWYWx1ZSA9IGV2YWxBc0RlZmF1bHRcbiAgICAgIGlmIChzdHIgPT09ICd1bnNldCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDExKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdHIuaW5kZXhPZignanM6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigzKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCd7JykgIT09IDApIHtcbiAgICAgICAgc3RyID0gJ3snICsgc3RyICsgJ30nXG4gICAgICB9XG4gICAgICBsZXQgdmFyc1ZhbHVlc1xuICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkgeyByZXR1cm4gRnVuY3Rpb24oJ3JldHVybiAoJyArIHN0ciArICcpJykoKSB9LCB7fSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBwYXJzZUpTT04oc3RyKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFyc1ZhbHVlcykge1xuICAgICAgICBpZiAodmFyc1ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gdmFyc1ZhbHVlc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7KCkgPT4gYW55fSB0b0V2YWxcbiAgICogQHBhcmFtIHthbnk9fSBkZWZhdWx0VmFsXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUV2YWwoZWx0LCB0b0V2YWwsIGRlZmF1bHRWYWwpIHtcbiAgICBpZiAoaHRteC5jb25maWcuYWxsb3dFdmFsKSB7XG4gICAgICByZXR1cm4gdG9FdmFsKClcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpldmFsRGlzYWxsb3dlZEVycm9yJylcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFycycsIHRydWUsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFscycsIGZhbHNlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBnZXRFeHByZXNzaW9uVmFycyhlbHQpIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3RzKGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0KSwgZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGhlYWRlclZhbHVlXG4gICAqL1xuICBmdW5jdGlvbiBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpIHtcbiAgICBpZiAoaGVhZGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBPbiBhbiBleGNlcHRpb24sIHRyeSB0byBzZXQgdGhlIGhlYWRlciBVUkkgZW5jb2RlZCBpbnN0ZWFkXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgZW5jb2RlVVJJQ29tcG9uZW50KGhlYWRlclZhbHVlKSlcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyICsgJy1VUkktQXV0b0VuY29kZWQnLCAndHJ1ZScpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocikge1xuICAvLyBOQjogSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgc3R1ZmZcbiAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICYmIHR5cGVvZiAoVVJMKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoeGhyLnJlc3BvbnNlVVJMKVxuICAgICAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJhZFJlc3BvbnNlVXJsJywgeyB1cmw6IHhoci5yZXNwb25zZVVSTCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzSGVhZGVyKHhociwgcmVnZXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cC50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZXMgYW4gaHRteC1zdHlsZSBBSkFYIHJlcXVlc3RcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWpheFxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBVUkwgcGF0aCB0byBtYWtlIHRoZSBBSkFYXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd8SHRteEFqYXhIZWxwZXJDb250ZXh0fSBjb250ZXh0IHRoZSBlbGVtZW50IHRvIHRhcmdldCAoZGVmYXVsdHMgdG8gdGhlICoqYm9keSoqKSB8IGEgc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgfCBhIGNvbnRleHQgb2JqZWN0IHRoYXQgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmdcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5IGlmIG5vIHJlcXVlc3QgaXMgc2VudCwgb3Igd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgZnVuY3Rpb24gYWpheEhlbHBlcih2ZXJiLCBwYXRoLCBjb250ZXh0KSB7XG4gICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8odmVyYi50b0xvd2VyQ2FzZSgpKSlcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dCksXG4gICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgcmVzb2x2ZVRhcmdldChjb250ZXh0LnNvdXJjZSksIGNvbnRleHQuZXZlbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGFuZGxlcjogY29udGV4dC5oYW5kbGVyLFxuICAgICAgICAgICAgaGVhZGVyczogY29udGV4dC5oZWFkZXJzLFxuICAgICAgICAgICAgdmFsdWVzOiBjb250ZXh0LnZhbHVlcyxcbiAgICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQudGFyZ2V0KSxcbiAgICAgICAgICAgIHN3YXBPdmVycmlkZTogY29udGV4dC5zd2FwLFxuICAgICAgICAgICAgc2VsZWN0OiBjb250ZXh0LnNlbGVjdCxcbiAgICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGhpZXJhcmNoeUZvckVsdChlbHQpIHtcbiAgICBjb25zdCBhcnIgPSBbXVxuICAgIHdoaWxlIChlbHQpIHtcbiAgICAgIGFyci5wdXNoKGVsdClcbiAgICAgIGVsdCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB2ZXJpZnlQYXRoKGVsdCwgcGF0aCwgcmVxdWVzdENvbmZpZykge1xuICAgIGxldCBzYW1lSG9zdFxuICAgIGxldCB1cmxcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXJsID0gbmV3IFVSTChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKVxuICAgICAgY29uc3Qgb3JpZ2luID0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgICBzYW1lSG9zdCA9IG9yaWdpbiA9PT0gdXJsLm9yaWdpblxuICAgIH0gZWxzZSB7XG4gICAgLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgVVJMXG4gICAgICB1cmwgPSBwYXRoXG4gICAgICBzYW1lSG9zdCA9IHN0YXJ0c1dpdGgocGF0aCwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5zZWxmUmVxdWVzdHNPbmx5KSB7XG4gICAgICBpZiAoIXNhbWVIb3N0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGVVcmwnLCBtZXJnZU9iamVjdHMoeyB1cmwsIHNhbWVIb3N0IH0sIHJlcXVlc3RDb25maWcpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZvcm1EYXRhfSBvYmpcbiAgICogQHJldHVybiB7Rm9ybURhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvcm1EYXRhKSByZXR1cm4gb2JqXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0uZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9ialtrZXldLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgIShvYmpba2V5XSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgSlNPTi5zdHJpbmdpZnkob2JqW2tleV0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhQXJyYXlQcm94eShmb3JtRGF0YSwgbmFtZSwgYXJyYXkpIHtcbiAgICAvLyBtdXRhdGluZyB0aGUgYXJyYXkgc2hvdWxkIG11dGF0ZSB0aGUgdW5kZXJseWluZyBmb3JtIGRhdGFcbiAgICByZXR1cm4gbmV3IFByb3h5KGFycmF5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIGlmIChrZXkgPT09ICdsZW5ndGgnKSByZXR1cm4gdGFyZ2V0Lmxlbmd0aFxuICAgICAgICBpZiAoa2V5ID09PSAncHVzaCcpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpXG4gICAgICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldFtrZXldICYmIHRhcmdldFtrZXldLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFQcm94eShmb3JtRGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZm9ybURhdGEsIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHN5bWJvbCBjYWxscyB0byB0aGUgRm9ybURhdGEgaXRzZWxmIGRpcmVjdGx5XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgbmFtZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ3RvSlNPTicpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IEpTT04uc3RyaW5naWZ5IGNhbGwgb24gcHJveHlcbiAgICAgICAgICByZXR1cm4gKCkgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lIGluIHRhcmdldCkge1xuICAgICAgICAgIC8vIFdyYXAgaW4gZnVuY3Rpb24gd2l0aCBhcHBseSB0byBjb3JyZWN0bHkgYmluZCB0aGUgRm9ybURhdGEgY29udGV4dCwgYXMgYSBkaXJlY3QgY2FsbCB3b3VsZCByZXN1bHQgaW4gYW4gaWxsZWdhbCBpbnZvY2F0aW9uIGVycm9yXG4gICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcm1EYXRhW25hbWVdLmFwcGx5KGZvcm1EYXRhLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXkgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgICAgLy8gVGhvc2UgMiB1bmRlZmluZWQgJiBzaW5nbGUgdmFsdWUgcmV0dXJucyBhcmUgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkgYXMgd2Ugd2VyZW4ndCB1c2luZyBGb3JtRGF0YSBiZWZvcmVcbiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gYXJyYXlbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZm9ybURhdGFBcnJheVByb3h5KHRhcmdldCwgbmFtZSwgYXJyYXkpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IHRhcmdldC5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEodmFsdWUgaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICAvLyBTdXBwb3J0IE9iamVjdC5hc3NpZ24gY2FsbCBmcm9tIHByb3h5XG4gICAgICBvd25LZXlzOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSlcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRhcmdldCwgcHJvcCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCksIHByb3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7SHRteEFqYXhFdGN9IFtldGNdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmZpcm1lZF1cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCBjb25maXJtZWQpIHtcbiAgICBsZXQgcmVzb2x2ZSA9IG51bGxcbiAgICBsZXQgcmVqZWN0ID0gbnVsbFxuICAgIGV0YyA9IGV0YyAhPSBudWxsID8gZXRjIDoge31cbiAgICBpZiAoZXRjLnJldHVyblByb21pc2UgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICByZWplY3QgPSBfcmVqZWN0XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIGVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZUhhbmRsZXIgPSBldGMuaGFuZGxlciB8fCBoYW5kbGVBamF4UmVzcG9uc2VcbiAgICBjb25zdCBzZWxlY3QgPSBldGMuc2VsZWN0IHx8IG51bGxcblxuICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAvLyBkbyBub3QgaXNzdWUgcmVxdWVzdHMgZm9yIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV0Yy50YXJnZXRPdmVycmlkZSB8fCBhc0VsZW1lbnQoZ2V0VGFyZ2V0KGVsdCkpXG4gICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IHRhcmdldCA9PSBEVU1NWV9FTFQpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGFyZ2V0RXJyb3InLCB7IHRhcmdldDogZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JykgfSlcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGxldCBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBjb25zdCBzdWJtaXR0ZXIgPSBlbHREYXRhLmxhc3RCdXR0b25DbGlja2VkXG5cbiAgICBpZiAoc3VibWl0dGVyKSB7XG4gICAgICBjb25zdCBidXR0b25QYXRoID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1hY3Rpb24nKVxuICAgICAgaWYgKGJ1dHRvblBhdGggIT0gbnVsbCkge1xuICAgICAgICBwYXRoID0gYnV0dG9uUGF0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25WZXJiID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1tZXRob2QnKVxuICAgICAgaWYgKGJ1dHRvblZlcmIgIT0gbnVsbCkge1xuICAgICAgLy8gaWdub3JlIGJ1dHRvbnMgd2l0aCBmb3JtbWV0aG9kPVwiZGlhbG9nXCJcbiAgICAgICAgaWYgKGJ1dHRvblZlcmIudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyhidXR0b25WZXJiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm1RdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1jb25maXJtJylcbiAgICAvLyBhbGxvdyBldmVudC1iYXNlZCBjb25maXJtYXRpb24gdy8gYSBjYWxsYmFja1xuICAgIGlmIChjb25maXJtZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNzdWVSZXF1ZXN0ID0gZnVuY3Rpb24oc2tpcENvbmZpcm1hdGlvbikge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsICEhc2tpcENvbmZpcm1hdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpcm1EZXRhaWxzID0geyB0YXJnZXQsIGVsdCwgcGF0aCwgdmVyYiwgdHJpZ2dlcmluZ0V2ZW50OiBldmVudCwgZXRjLCBpc3N1ZVJlcXVlc3QsIHF1ZXN0aW9uOiBjb25maXJtUXVlc3Rpb24gfVxuICAgICAgaWYgKHRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpcm0nLCBjb25maXJtRGV0YWlscykgPT09IGZhbHNlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzeW5jRWx0ID0gZWx0XG4gICAgbGV0IHN5bmNTdHJhdGVneSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zeW5jJylcbiAgICBsZXQgcXVldWVTdHJhdGVneSA9IG51bGxcbiAgICBsZXQgYWJvcnRhYmxlID0gZmFsc2VcbiAgICBpZiAoc3luY1N0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBzeW5jU3RyaW5ncyA9IHN5bmNTdHJhdGVneS5zcGxpdCgnOicpXG4gICAgICBjb25zdCBzZWxlY3RvciA9IHN5bmNTdHJpbmdzWzBdLnRyaW0oKVxuICAgICAgaWYgKHNlbGVjdG9yID09PSAndGhpcycpIHtcbiAgICAgICAgc3luY0VsdCA9IGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC1zeW5jJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN5bmNFbHQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHNlbGVjdG9yKSlcbiAgICAgIH1cbiAgICAgIC8vIGRlZmF1bHQgdG8gdGhlIGRyb3Agc3RyYXRlZ3lcbiAgICAgIHN5bmNTdHJhdGVneSA9IChzeW5jU3RyaW5nc1sxXSB8fCAnZHJvcCcpLnRyaW0oKVxuICAgICAgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShzeW5jRWx0KVxuICAgICAgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Ryb3AnICYmIGVsdERhdGEueGhyICYmIGVsdERhdGEuYWJvcnRhYmxlICE9PSB0cnVlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdhYm9ydCcpIHtcbiAgICAgICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhYm9ydGFibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAncmVwbGFjZScpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5LmluZGV4T2YoJ3F1ZXVlJykgPT09IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVTdHJBcnJheSA9IHN5bmNTdHJhdGVneS5zcGxpdCgnICcpXG4gICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAocXVldWVTdHJBcnJheVsxXSB8fCAnbGFzdCcpLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgaWYgKGVsdERhdGEuYWJvcnRhYmxlKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZlbnQpXG4gICAgICAgICAgICBpZiAoZXZlbnREYXRhICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyAmJiBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWUpIHtcbiAgICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9IGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gJ2xhc3QnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID09IG51bGwpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2ZpcnN0JyAmJiBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdsYXN0Jykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXSAvLyBkdW1wIGV4aXN0aW5nIHF1ZXVlXG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGVsdERhdGEueGhyID0geGhyXG4gICAgZWx0RGF0YS5hYm9ydGFibGUgPSBhYm9ydGFibGVcbiAgICBjb25zdCBlbmRSZXF1ZXN0TG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWx0RGF0YS54aHIgPSBudWxsXG4gICAgICBlbHREYXRhLmFib3J0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyAhPSBudWxsICYmXG4gICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVkUmVxdWVzdCA9IGVsdERhdGEucXVldWVkUmVxdWVzdHMuc2hpZnQoKVxuICAgICAgICBxdWV1ZWRSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvbXB0UXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHJvbXB0JylcbiAgICBpZiAocHJvbXB0UXVlc3Rpb24pIHtcbiAgICAgIHZhciBwcm9tcHRSZXNwb25zZSA9IHByb21wdChwcm9tcHRRdWVzdGlvbilcbiAgICAgIC8vIHByb21wdCByZXR1cm5zIG51bGwgaWYgY2FuY2VsbGVkIGFuZCBlbXB0eSBzdHJpbmcgaWYgYWNjZXB0ZWQgd2l0aCBubyBlbnRyeVxuICAgICAgaWYgKHByb21wdFJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgICAhdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cHJvbXB0JywgeyBwcm9tcHQ6IHByb21wdFJlc3BvbnNlLCB0YXJnZXQgfSkpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybVF1ZXN0aW9uICYmICFjb25maXJtZWQpIHtcbiAgICAgIGlmICghY29uZmlybShjb25maXJtUXVlc3Rpb24pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHRSZXNwb25zZSlcblxuICAgIGlmICh2ZXJiICE9PSAnZ2V0JyAmJiAhdXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICB9XG5cbiAgICBpZiAoZXRjLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMgPSBtZXJnZU9iamVjdHMoaGVhZGVycywgZXRjLmhlYWRlcnMpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpXG4gICAgbGV0IGVycm9ycyA9IHJlc3VsdHMuZXJyb3JzXG4gICAgY29uc3QgcmF3Rm9ybURhdGEgPSByZXN1bHRzLmZvcm1EYXRhXG4gICAgaWYgKGV0Yy52YWx1ZXMpIHtcbiAgICAgIG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGZvcm1EYXRhRnJvbU9iamVjdChldGMudmFsdWVzKSlcbiAgICB9XG4gICAgY29uc3QgZXhwcmVzc2lvblZhcnMgPSBmb3JtRGF0YUZyb21PYmplY3QoZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSlcbiAgICBjb25zdCBhbGxGb3JtRGF0YSA9IG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGV4cHJlc3Npb25WYXJzKVxuICAgIGxldCBmaWx0ZXJlZEZvcm1EYXRhID0gZmlsdGVyVmFsdWVzKGFsbEZvcm1EYXRhLCBlbHQpXG5cbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSAmJiB2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgZmlsdGVyZWRGb3JtRGF0YS5zZXQoJ29yZy5odG14LmNhY2hlLWJ1c3RlcicsIGdldFJhd0F0dHJpYnV0ZSh0YXJnZXQsICdpZCcpIHx8ICd0cnVlJylcbiAgICB9XG5cbiAgICAvLyBiZWhhdmlvciBvZiBhbmNob3JzIHcvIGVtcHR5IGhyZWYgaXMgdG8gdXNlIHRoZSBjdXJyZW50IFVSTFxuICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aCA9PT0gJycpIHtcbiAgICAgIHBhdGggPSBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtub0hlYWRlcnNdXG4gICAgICovXG4gICAgY29uc3QgcmVxdWVzdEF0dHJWYWx1ZXMgPSBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXJlcXVlc3QnKVxuXG4gICAgY29uc3QgZWx0SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHVzZVVybFBhcmFtcyA9IGh0bXguY29uZmlnLm1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zLmluZGV4T2YodmVyYikgPj0gMFxuXG4gICAgLyoqIEB0eXBlIEh0bXhSZXF1ZXN0Q29uZmlnICovXG4gICAgY29uc3QgcmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHVzZVVybFBhcmFtcyxcbiAgICAgIGZvcm1EYXRhOiBmaWx0ZXJlZEZvcm1EYXRhLFxuICAgICAgcGFyYW1ldGVyczogZm9ybURhdGFQcm94eShmaWx0ZXJlZEZvcm1EYXRhKSxcbiAgICAgIHVuZmlsdGVyZWRGb3JtRGF0YTogYWxsRm9ybURhdGEsXG4gICAgICB1bmZpbHRlcmVkUGFyYW1ldGVyczogZm9ybURhdGFQcm94eShhbGxGb3JtRGF0YSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdmVyYixcbiAgICAgIGVycm9ycyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogZXRjLmNyZWRlbnRpYWxzIHx8IHJlcXVlc3RBdHRyVmFsdWVzLmNyZWRlbnRpYWxzIHx8IGh0bXguY29uZmlnLndpdGhDcmVkZW50aWFscyxcbiAgICAgIHRpbWVvdXQ6IGV0Yy50aW1lb3V0IHx8IHJlcXVlc3RBdHRyVmFsdWVzLnRpbWVvdXQgfHwgaHRteC5jb25maWcudGltZW91dCxcbiAgICAgIHBhdGgsXG4gICAgICB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50XG4gICAgfVxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maWdSZXF1ZXN0JywgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICAvLyBjb3B5IG91dCBpbiBjYXNlIHRoZSBvYmplY3Qgd2FzIG92ZXJ3cml0dGVuXG4gICAgcGF0aCA9IHJlcXVlc3RDb25maWcucGF0aFxuICAgIHZlcmIgPSByZXF1ZXN0Q29uZmlnLnZlcmJcbiAgICBoZWFkZXJzID0gcmVxdWVzdENvbmZpZy5oZWFkZXJzXG4gICAgZmlsdGVyZWRGb3JtRGF0YSA9IGZvcm1EYXRhRnJvbU9iamVjdChyZXF1ZXN0Q29uZmlnLnBhcmFtZXRlcnMpXG4gICAgZXJyb3JzID0gcmVxdWVzdENvbmZpZy5lcnJvcnNcbiAgICB1c2VVcmxQYXJhbXMgPSByZXF1ZXN0Q29uZmlnLnVzZVVybFBhcmFtc1xuXG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGlvbjpoYWx0ZWQnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0UGF0aCA9IHBhdGguc3BsaXQoJyMnKVxuICAgIGNvbnN0IHBhdGhOb0FuY2hvciA9IHNwbGl0UGF0aFswXVxuICAgIGNvbnN0IGFuY2hvciA9IHNwbGl0UGF0aFsxXVxuXG4gICAgbGV0IGZpbmFsUGF0aCA9IHBhdGhcbiAgICBpZiAodXNlVXJsUGFyYW1zKSB7XG4gICAgICBmaW5hbFBhdGggPSBwYXRoTm9BbmNob3JcbiAgICAgIGNvbnN0IGhhc1ZhbHVlcyA9ICFmaWx0ZXJlZEZvcm1EYXRhLmtleXMoKS5uZXh0KCkuZG9uZVxuICAgICAgaWYgKGhhc1ZhbHVlcykge1xuICAgICAgICBpZiAoZmluYWxQYXRoLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJz8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcmJ1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsUGF0aCArPSB1cmxFbmNvZGUoZmlsdGVyZWRGb3JtRGF0YSlcbiAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnIycgKyBhbmNob3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdmVyaWZ5UGF0aChlbHQsIGZpbmFsUGF0aCwgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6aW52YWxpZFBhdGgnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgeGhyLm9wZW4odmVyYi50b1VwcGVyQ2FzZSgpLCBmaW5hbFBhdGgsIHRydWUpXG4gICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvaHRtbCcpXG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHJlcXVlc3RDb25maWcud2l0aENyZWRlbnRpYWxzXG4gICAgeGhyLnRpbWVvdXQgPSByZXF1ZXN0Q29uZmlnLnRpbWVvdXRcblxuICAgIC8vIHJlcXVlc3QgaGVhZGVyc1xuICAgIGlmIChyZXF1ZXN0QXR0clZhbHVlcy5ub0hlYWRlcnMpIHtcbiAgICAvLyBpZ25vcmUgYWxsIGhlYWRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlcl1cbiAgICAgICAgICBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0h0bXhSZXNwb25zZUluZm99ICovXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvID0ge1xuICAgICAgeGhyLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcmVxdWVzdENvbmZpZyxcbiAgICAgIGV0YyxcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHNlbGVjdCxcbiAgICAgIHBhdGhJbmZvOiB7XG4gICAgICAgIHJlcXVlc3RQYXRoOiBwYXRoLFxuICAgICAgICBmaW5hbFJlcXVlc3RQYXRoOiBmaW5hbFBhdGgsXG4gICAgICAgIHJlc3BvbnNlUGF0aDogbnVsbCxcbiAgICAgICAgYW5jaG9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGllcmFyY2h5ID0gaGllcmFyY2h5Rm9yRWx0KGVsdClcbiAgICAgICAgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aCA9IGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKVxuICAgICAgICByZXNwb25zZUhhbmRsZXIoZWx0LCByZXNwb25zZUluZm8pXG4gICAgICAgIGlmIChyZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgIT09IHRydWUpIHtcbiAgICAgICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAvLyBpZiB0aGUgYm9keSBubyBsb25nZXIgY29udGFpbnMgdGhlIGVsZW1lbnQsIHRyaWdnZXIgdGhlIGV2ZW50IG9uIHRoZSBjbG9zZXN0IHBhcmVudFxuICAgICAgICAvLyByZW1haW5pbmcgaW4gdGhlIERPTVxuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgbGV0IHNlY29uZGFyeVRyaWdnZXJFbHQgPSBudWxsXG4gICAgICAgICAgd2hpbGUgKGhpZXJhcmNoeS5sZW5ndGggPiAwICYmIHNlY29uZGFyeVRyaWdnZXJFbHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50RWx0SW5IaWVyYXJjaHkgPSBoaWVyYXJjaHkuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKGJvZHlDb250YWlucyhwYXJlbnRFbHRJbkhpZXJhcmNoeSkpIHtcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IHBhcmVudEVsdEluSGllcmFyY2h5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWNvbmRhcnlUcmlnZ2VyRWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14Om9uTG9hZEVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgdGhyb3cgZVxuICAgICAgfVxuICAgIH1cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRBYm9ydCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRpbWVvdXQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVJlcXVlc3QnLCByZXNwb25zZUluZm8pKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIHZhciBpbmRpY2F0b3JzID0gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KVxuICAgIHZhciBkaXNhYmxlRWx0cyA9IGRpc2FibGVFbGVtZW50cyhlbHQpXG5cbiAgICBmb3JFYWNoKFsnbG9hZHN0YXJ0JywgJ2xvYWRlbmQnLCAncHJvZ3Jlc3MnLCAnYWJvcnQnXSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBmb3JFYWNoKFt4aHIsIHhoci51cGxvYWRdLCBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnhocjonICsgZXZlbnROYW1lLCB7XG4gICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudC5sZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogZXZlbnQudG90YWxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVNlbmQnLCByZXNwb25zZUluZm8pXG4gICAgY29uc3QgcGFyYW1zID0gdXNlVXJsUGFyYW1zID8gbnVsbCA6IGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkRm9ybURhdGEpXG4gICAgeGhyLnNlbmQocGFyYW1zKVxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlVcGRhdGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3R5cGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFtwYXRoXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICogQHJldHVybiB7SHRteEhpc3RvcnlVcGRhdGV9XG4gICAqL1xuICBmdW5jdGlvbiBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBGaXJzdCBjb25zdWx0IHJlc3BvbnNlIGhlYWRlcnNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IHBhdGhGcm9tSGVhZGVycyA9IG51bGxcbiAgICBsZXQgdHlwZUZyb21IZWFkZXJzID0gbnVsbFxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaC1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVwbGFjZS1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlcGxhY2UtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdyZXBsYWNlJ1xuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIHdhcyBhIHJlc3BvbnNlIGhlYWRlciwgdGhhdCBoYXMgcHJpb3JpdHlcbiAgICBpZiAocGF0aEZyb21IZWFkZXJzKSB7XG4gICAgICBpZiAocGF0aEZyb21IZWFkZXJzID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0eXBlRnJvbUhlYWRlcnMsXG4gICAgICAgICAgcGF0aDogcGF0aEZyb21IZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTmV4dCByZXNvbHZlIHZpYSBET00gdmFsdWVzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmZpbmFsUmVxdWVzdFBhdGhcbiAgICBjb25zdCByZXNwb25zZVBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoXG5cbiAgICBjb25zdCBwdXNoVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXB1c2gtdXJsJylcbiAgICBjb25zdCByZXBsYWNlVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXJlcGxhY2UtdXJsJylcbiAgICBjb25zdCBlbGVtZW50SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHNhdmVUeXBlID0gbnVsbFxuICAgIGxldCBwYXRoID0gbnVsbFxuXG4gICAgaWYgKHB1c2hVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcHVzaFVybFxuICAgIH0gZWxzZSBpZiAocmVwbGFjZVVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncmVwbGFjZSdcbiAgICAgIHBhdGggPSByZXBsYWNlVXJsXG4gICAgfSBlbHNlIGlmIChlbGVtZW50SXNCb29zdGVkKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgIC8vIGZhbHNlIGluZGljYXRlcyBubyBwdXNoLCByZXR1cm4gZW1wdHkgb2JqZWN0XG4gICAgICBpZiAocGF0aCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgLy8gdHJ1ZSBpbmRpY2F0ZXMgd2Ugd2FudCB0byBmb2xsb3cgd2hlcmV2ZXIgdGhlIHNlcnZlciBlbmRlZCB1cCBzZW5kaW5nIHVzXG4gICAgICBpZiAocGF0aCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgICB9XG5cbiAgICAgIC8vIHJlc3RvcmUgYW55IGFuY2hvciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RcbiAgICAgIGlmIChyZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yICYmIHBhdGguaW5kZXhPZignIycpID09PSAtMSkge1xuICAgICAgICBwYXRoID0gcGF0aCArICcjJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogc2F2ZVR5cGUsXG4gICAgICAgIHBhdGhcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9IHJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0NvbmZpZywgc3RhdHVzKSB7XG4gICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVzcG9uc2VIYW5kbGluZ0NvbmZpZy5jb2RlKVxuICAgIHJldHVybiByZWdFeHAudGVzdChzdGF0dXMudG9TdHJpbmcoMTApKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ31cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnICovXG4gICAgICB2YXIgcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQgPSBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nW2ldXG4gICAgICBpZiAoY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQsIHhoci5zdGF0dXMpKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUhhbmRsaW5nRWxlbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBubyBtYXRjaGVzLCByZXR1cm4gbm8gc3dhcFxuICAgIHJldHVybiB7XG4gICAgICBzd2FwOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRpdGxlKHRpdGxlKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBjb25zdCB0aXRsZUVsdCA9IGZpbmQoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsdCkge1xuICAgICAgICB0aXRsZUVsdC5pbm5lckhUTUwgPSB0aXRsZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnRpdGxlID0gdGl0bGVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUFqYXhSZXNwb25zZShlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcbiAgICBsZXQgdGFyZ2V0ID0gcmVzcG9uc2VJbmZvLnRhcmdldFxuICAgIGNvbnN0IGV0YyA9IHJlc3BvbnNlSW5mby5ldGNcbiAgICBjb25zdCByZXNwb25zZUluZm9TZWxlY3QgPSByZXNwb25zZUluZm8uc2VsZWN0XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZU9uTG9hZCcsIHJlc3BvbnNlSW5mbykpIHJldHVyblxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyOi9pKSkge1xuICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyJywgZWx0KVxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtTG9jYXRpb246L2kpKSB7XG4gICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgbGV0IHJlZGlyZWN0UGF0aCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtTG9jYXRpb24nKVxuICAgICAgLyoqIEB0eXBlIHtIdG14QWpheEhlbHBlckNvbnRleHQme3BhdGg6c3RyaW5nfX0gKi9cbiAgICAgIHZhciByZWRpcmVjdFN3YXBTcGVjXG4gICAgICBpZiAocmVkaXJlY3RQYXRoLmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgICByZWRpcmVjdFN3YXBTcGVjID0gcGFyc2VKU09OKHJlZGlyZWN0UGF0aClcbiAgICAgICAgLy8gd2hhdCdzIHRoZSBiZXN0IHdheSB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdXNlciBkaWRuJ3QgaW5jbHVkZSB0aGlzXG4gICAgICAgIHJlZGlyZWN0UGF0aCA9IHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgICBkZWxldGUgcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICB9XG4gICAgICBhamF4SGVscGVyKCdnZXQnLCByZWRpcmVjdFBhdGgsIHJlZGlyZWN0U3dhcFNwZWMpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShyZWRpcmVjdFBhdGgpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUmVmcmVzaCA9IGhhc0hlYWRlcih4aHIsIC9IWC1SZWZyZXNoOi9pKSAmJiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZnJlc2gnKSA9PT0gJ3RydWUnXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlZGlyZWN0Oi9pKSkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24uaHJlZiA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVkaXJlY3QnKVxuICAgICAgc2hvdWxkUmVmcmVzaCAmJiBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlZnJlc2gpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGlzdG9yeVVwZGF0ZSA9IGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKVxuXG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGluZyA9IHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocilcbiAgICBjb25zdCBzaG91bGRTd2FwID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwXG4gICAgbGV0IGlzRXJyb3IgPSAhIXJlc3BvbnNlSGFuZGxpbmcuZXJyb3JcbiAgICBsZXQgaWdub3JlVGl0bGUgPSBodG14LmNvbmZpZy5pZ25vcmVUaXRsZSB8fCByZXNwb25zZUhhbmRsaW5nLmlnbm9yZVRpdGxlXG4gICAgbGV0IHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zZWxlY3RcbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy50YXJnZXQpIHtcbiAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSlcbiAgICB9XG4gICAgdmFyIHN3YXBPdmVycmlkZSA9IGV0Yy5zd2FwT3ZlcnJpZGVcbiAgICBpZiAoc3dhcE92ZXJyaWRlID09IG51bGwgJiYgcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGUpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlXG4gICAgfVxuXG4gICAgLy8gcmVzcG9uc2UgaGVhZGVycyBvdmVycmlkZSByZXNwb25zZSBoYW5kbGluZyBjb25maWdcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgIH1cblxuICAgIHZhciBzZXJ2ZXJSZXNwb25zZSA9IHhoci5yZXNwb25zZVxuICAgIC8qKiBAdHlwZSBIdG14QmVmb3JlU3dhcERldGFpbHMgKi9cbiAgICB2YXIgYmVmb3JlU3dhcERldGFpbHMgPSBtZXJnZU9iamVjdHMoe1xuICAgICAgc2hvdWxkU3dhcCxcbiAgICAgIHNlcnZlclJlc3BvbnNlLFxuICAgICAgaXNFcnJvcixcbiAgICAgIGlnbm9yZVRpdGxlLFxuICAgICAgc2VsZWN0T3ZlcnJpZGVcbiAgICB9LCByZXNwb25zZUluZm8pXG5cbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy5ldmVudCAmJiAhdHJpZ2dlckV2ZW50KHRhcmdldCwgcmVzcG9uc2VIYW5kbGluZy5ldmVudCwgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6YmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgc2VydmVyUmVzcG9uc2UgPSBiZWZvcmVTd2FwRGV0YWlscy5zZXJ2ZXJSZXNwb25zZSAvLyBhbGxvdyB1cGRhdGluZyBjb250ZW50XG4gICAgaXNFcnJvciA9IGJlZm9yZVN3YXBEZXRhaWxzLmlzRXJyb3IgLy8gYWxsb3cgdXBkYXRpbmcgZXJyb3JcbiAgICBpZ25vcmVUaXRsZSA9IGJlZm9yZVN3YXBEZXRhaWxzLmlnbm9yZVRpdGxlIC8vIGFsbG93IHVwZGF0aW5nIGlnbm9yaW5nIHRpdGxlXG4gICAgc2VsZWN0T3ZlcnJpZGUgPSBiZWZvcmVTd2FwRGV0YWlscy5zZWxlY3RPdmVycmlkZSAvLyBhbGxvdyB1cGRhdGluZyBzZWxlY3Qgb3ZlcnJpZGVcblxuICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSB0YXJnZXQgLy8gTWFrZSB1cGRhdGVkIHRhcmdldCBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLmZhaWxlZCA9IGlzRXJyb3IgLy8gTWFrZSBmYWlsZWQgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5zdWNjZXNzZnVsID0gIWlzRXJyb3IgLy8gTWFrZSBzdWNjZXNzZnVsIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcblxuICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjg2KSB7XG4gICAgICAgIGNhbmNlbFBvbGxpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IGV4dGVuc2lvbi50cmFuc2Zvcm1SZXNwb25zZShzZXJ2ZXJSZXNwb25zZSwgeGhyLCBlbHQpXG4gICAgICB9KVxuXG4gICAgICAvLyBTYXZlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSB3aWxsIGJlIGEgaGlzdG9yeSB1cGRhdGVcbiAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICAgIH1cbiAgICAgIHZhciBzd2FwU3BlYyA9IGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcE92ZXJyaWRlKVxuXG4gICAgICBpZiAoIXN3YXBTcGVjLmhhc093blByb3BlcnR5KCdpZ25vcmVUaXRsZScpKSB7XG4gICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gaWdub3JlVGl0bGVcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcblxuICAgICAgLy8gb3B0aW9uYWwgdHJhbnNpdGlvbiBBUEkgcHJvbWlzZSBjYWxsYmFja3NcbiAgICAgIGxldCBzZXR0bGVSZXNvbHZlID0gbnVsbFxuICAgICAgbGV0IHNldHRsZVJlamVjdCA9IG51bGxcblxuICAgICAgaWYgKHJlc3BvbnNlSW5mb1NlbGVjdCkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSW5mb1NlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc2VsZWN0Oi9pKSkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzZWxlY3QnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3RPT0IgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0LW9vYicpXG4gICAgICBjb25zdCBzZWxlY3QgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0JylcblxuICAgICAgbGV0IGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGlmIHdlIG5lZWQgdG8gc2F2ZSBoaXN0b3J5LCBkbyBzbywgYmVmb3JlIHN3YXBwaW5nIHNvIHRoYXQgcmVsYXRpdmUgcmVzb3VyY2VzIGhhdmUgdGhlIGNvcnJlY3QgYmFzZSBVUkxcbiAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5VXBkYXRlJywgbWVyZ2VPYmplY3RzKHsgaGlzdG9yeTogaGlzdG9yeVVwZGF0ZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnB1c2hlZEludG9IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VVcmxJbkhpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpyZXBsYWNlZEluSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dhcCh0YXJnZXQsIHNlcnZlclJlc3BvbnNlLCBzd2FwU3BlYywge1xuICAgICAgICAgICAgc2VsZWN0OiBzZWxlY3RPdmVycmlkZSB8fCBzZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3RPT0IsXG4gICAgICAgICAgICBldmVudEluZm86IHJlc3BvbnNlSW5mbyxcbiAgICAgICAgICAgIGFuY2hvcjogcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvcixcbiAgICAgICAgICAgIGNvbnRleHRFbGVtZW50OiBlbHQsXG4gICAgICAgICAgICBhZnRlclN3YXBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1Td2FwOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1Td2FwJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlclNldHRsZUNhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVNldHRsZTovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlc29sdmUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3dhcEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZWplY3QpXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBzaG91bGRUcmFuc2l0aW9uID0gaHRteC5jb25maWcuZ2xvYmFsVmlld1RyYW5zaXRpb25zXG4gICAgICBpZiAoc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ3RyYW5zaXRpb24nKSkge1xuICAgICAgICBzaG91bGRUcmFuc2l0aW9uID0gc3dhcFNwZWMudHJhbnNpdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVUcmFuc2l0aW9uJywgcmVzcG9uc2VJbmZvKSAmJlxuICAgICAgICAgICAgICB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBjb25zdCBzZXR0bGVQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgICBzZXR0bGVSZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgICBzZXR0bGVSZWplY3QgPSBfcmVqZWN0XG4gICAgICAgIH0pXG4gICAgICAgIC8vIHdyYXAgdGhlIG9yaWdpbmFsIGRvU3dhcCgpIGluIGEgY2FsbCB0byBzdGFydFZpZXdUcmFuc2l0aW9uKClcbiAgICAgICAgY29uc3QgaW5uZXJEb1N3YXAgPSBkb1N3YXBcbiAgICAgICAgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5uZXJEb1N3YXAoKVxuICAgICAgICAgICAgcmV0dXJuIHNldHRsZVByb21pc2VcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzd2FwU3BlYy5zd2FwRGVsYXkgPiAwKSB7XG4gICAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9Td2FwLCBzd2FwU3BlYy5zd2FwRGVsYXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1N3YXAoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNFcnJvcikge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpyZXNwb25zZUVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6ICdSZXNwb25zZSBTdGF0dXMgRXJyb3IgQ29kZSAnICsgeGhyLnN0YXR1cyArICcgZnJvbSAnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlcXVlc3RQYXRoIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXh0ZW5zaW9ucyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIEh0bXhFeHRlbnNpb24+fSAqL1xuICBjb25zdCBleHRlbnNpb25zID0ge31cblxuICAvKipcbiAgICogZXh0ZW5zaW9uQmFzZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYWxsIGV4dGVuc2lvbnMuXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZXh0ZW5zaW9uQmFzZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5pdDogZnVuY3Rpb24oYXBpKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgb25FdmVudDogZnVuY3Rpb24obmFtZSwgZXZ0KSB7IHJldHVybiB0cnVlIH0sXG4gICAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24odGV4dCwgeGhyLCBlbHQpIHsgcmV0dXJuIHRleHQgfSxcbiAgICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgaGFuZGxlU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24oeGhyLCBwYXJhbWV0ZXJzLCBlbHQpIHsgcmV0dXJuIG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZWZpbmVFeHRlbnNpb24gaW5pdGlhbGl6ZXMgdGhlIGV4dGVuc2lvbiBhbmQgYWRkcyBpdCB0byB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNkZWZpbmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbn0gZXh0ZW5zaW9uIHRoZSBleHRlbnNpb24gZGVmaW5pdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gZGVmaW5lRXh0ZW5zaW9uKG5hbWUsIGV4dGVuc2lvbikge1xuICAgIGlmIChleHRlbnNpb24uaW5pdCkge1xuICAgICAgZXh0ZW5zaW9uLmluaXQoaW50ZXJuYWxBUEkpXG4gICAgfVxuICAgIGV4dGVuc2lvbnNbbmFtZV0gPSBtZXJnZU9iamVjdHMoZXh0ZW5zaW9uQmFzZSgpLCBleHRlbnNpb24pXG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlRXh0ZW5zaW9uIHJlbW92ZXMgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFeHRlbnNpb24obmFtZSkge1xuICAgIGRlbGV0ZSBleHRlbnNpb25zW25hbWVdXG4gIH1cblxuICAvKipcbiAgICogZ2V0RXh0ZW5zaW9ucyBzZWFyY2hlcyB1cCB0aGUgRE9NIHRyZWUgdG8gcmV0dXJuIGFsbCBleHRlbnNpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbltdPX0gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nW109fSBleHRlbnNpb25zVG9JZ25vcmVcbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEV4dGVuc2lvbnMoZWx0LCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSkge1xuICAgIGlmIChleHRlbnNpb25zVG9SZXR1cm4gPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9SZXR1cm4gPSBbXVxuICAgIH1cbiAgICBpZiAoZWx0ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbnNUb1JldHVyblxuICAgIH1cbiAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlID0gW11cbiAgICB9XG4gICAgY29uc3QgZXh0ZW5zaW9uc0ZvckVsZW1lbnQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1leHQnKVxuICAgIGlmIChleHRlbnNpb25zRm9yRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChleHRlbnNpb25zRm9yRWxlbWVudC5zcGxpdCgnLCcpLCBmdW5jdGlvbihleHRlbnNpb25OYW1lKSB7XG4gICAgICAgIGV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb25OYW1lLnJlcGxhY2UoLyAvZywgJycpXG4gICAgICAgIGlmIChleHRlbnNpb25OYW1lLnNsaWNlKDAsIDcpID09ICdpZ25vcmU6Jykge1xuICAgICAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZS5wdXNoKGV4dGVuc2lvbk5hbWUuc2xpY2UoNykpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZS5pbmRleE9mKGV4dGVuc2lvbk5hbWUpIDwgMCkge1xuICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uTmFtZV1cbiAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmIGV4dGVuc2lvbnNUb1JldHVybi5pbmRleE9mKGV4dGVuc2lvbikgPCAwKSB7XG4gICAgICAgICAgICBleHRlbnNpb25zVG9SZXR1cm4ucHVzaChleHRlbnNpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEluaXRpYWxpemF0aW9uXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpc1JlYWR5ID0gZmFsc2VcbiAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgaXNSZWFkeSA9IHRydWVcbiAgfSlcblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIG5vdyBpZiBET01Db250ZW50TG9hZGVkIGhhcyBmaXJlZCwgb3RoZXJ3aXNlIGxpc3RlbiBmb3IgaXQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdXNlcyBpc1JlYWR5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGFzayB0aGUgYnJvd3NlciB3aGV0aGVyXG4gICAqIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gZmlyZWQ7IHRoZXJlJ3MgYSBnYXAgYmV0d2VlbiBET01Db250ZW50TG9hZGVkXG4gICAqIGZpcmluZyBhbmQgcmVhZHlzdGF0ZT1jb21wbGV0ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWR5KGZuKSB7XG4gICAgLy8gQ2hlY2tpbmcgcmVhZHlTdGF0ZSBoZXJlIGlzIGEgZmFpbHNhZmUgaW4gY2FzZSB0aGUgaHRteCBzY3JpcHQgdGFnIGVudGVyZWQgdGhlIERPTSBieVxuICAgIC8vIHNvbWUgbWVhbnMgb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQuXG4gICAgaWYgKGlzUmVhZHkgfHwgZ2V0RG9jdW1lbnQoKS5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICBmbigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydEluZGljYXRvclN0eWxlcygpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaW5jbHVkZUluZGljYXRvclN0eWxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG5vbmNlQXR0cmlidXRlID0gaHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZSA/IGAgbm9uY2U9XCIke2h0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2V9XCJgIDogJydcbiAgICAgIGdldERvY3VtZW50KCkuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsXG4gICAgICAgICc8c3R5bGUnICsgbm9uY2VBdHRyaWJ1dGUgKyAnPlxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjB9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJyAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJy4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgPC9zdHlsZT4nKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1ldGFDb25maWcoKSB7XG4gICAgLyoqIEB0eXBlIEhUTUxNZXRhRWxlbWVudCAqL1xuICAgIGNvbnN0IGVsZW1lbnQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImh0bXgtY29uZmlnXCJdJylcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHBhcnNlSlNPTihlbGVtZW50LmNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VNZXRhQ29uZmlnKCkge1xuICAgIGNvbnN0IG1ldGFDb25maWcgPSBnZXRNZXRhQ29uZmlnKClcbiAgICBpZiAobWV0YUNvbmZpZykge1xuICAgICAgaHRteC5jb25maWcgPSBtZXJnZU9iamVjdHMoaHRteC5jb25maWcsIG1ldGFDb25maWcpXG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnRcbiAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgbWVyZ2VNZXRhQ29uZmlnKClcbiAgICBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKVxuICAgIGxldCBib2R5ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgcHJvY2Vzc05vZGUoYm9keSlcbiAgICBjb25zdCByZXN0b3JlZEVsdHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIltoeC10cmlnZ2VyPSdyZXN0b3JlZCddLFtkYXRhLWh4LXRyaWdnZXI9J3Jlc3RvcmVkJ11cIlxuICAgIClcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWJvcnQnLCBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXRcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YSh0YXJnZXQpXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhICYmIGludGVybmFsRGF0YS54aHIpIHtcbiAgICAgICAgaW50ZXJuYWxEYXRhLnhoci5hYm9ydCgpXG4gICAgICB9XG4gICAgfSlcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIGNvbnN0IG9yaWdpbmFsUG9wc3RhdGUgPSB3aW5kb3cub25wb3BzdGF0ZSA/IHdpbmRvdy5vbnBvcHN0YXRlLmJpbmQod2luZG93KSA6IG51bGxcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5zdGF0ZSAmJiBldmVudC5zdGF0ZS5odG14KSB7XG4gICAgICAgIHJlc3RvcmVIaXN0b3J5KClcbiAgICAgICAgZm9yRWFjaChyZXN0b3JlZEVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnJlc3RvcmVkJywge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGdldERvY3VtZW50KCksXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsUG9wc3RhdGUpIHtcbiAgICAgICAgICBvcmlnaW5hbFBvcHN0YXRlKGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoYm9keSwgJ2h0bXg6bG9hZCcsIHt9KSAvLyBnaXZlIHJlYWR5IGhhbmRsZXJzIGEgY2hhbmNlIHRvIGxvYWQgdXAgYmVmb3JlIGZpcmluZyB0aGlzIGV2ZW50XG4gICAgICBib2R5ID0gbnVsbCAvLyBraWxsIHJlZmVyZW5jZSBmb3IgZ2NcbiAgICB9LCAwKVxuICB9KVxuXG4gIHJldHVybiBodG14XG59KSgpXG5cbi8qKiBAdHlwZWRlZiB7J2dldCd8J2hlYWQnfCdwb3N0J3wncHV0J3wnZGVsZXRlJ3wnY29ubmVjdCd8J29wdGlvbnMnfCd0cmFjZSd8J3BhdGNoJ30gSHR0cFZlcmIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2FwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdE9PQl1cbiAqIEBwcm9wZXJ0eSB7Kn0gW2V2ZW50SW5mb11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYW5jaG9yXVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbY29udGV4dEVsZW1lbnRdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU3dhcENhbGxiYWNrXVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclNldHRsZUNhbGxiYWNrXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHN3YXBDYWxsYmFja1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeydpbm5lckhUTUwnIHwgJ291dGVySFRNTCcgfCAnYmVmb3JlYmVnaW4nIHwgJ2FmdGVyYmVnaW4nIHwgJ2JlZm9yZWVuZCcgfCAnYWZ0ZXJlbmQnIHwgJ2RlbGV0ZScgfCAnbm9uZScgfCBzdHJpbmd9IEh0bXhTd2FwU3R5bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEh0bXhTd2FwU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzd2FwRGVsYXlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZXR0bGVEZWxheVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJhbnNpdGlvbl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoZWFkXVxuICogQHByb3BlcnR5IHsndG9wJyB8ICdib3R0b20nfSBbc2Nyb2xsXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JvbGxUYXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3ddXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3dUYXJnZXRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb2N1c1Njcm9sbF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKHRoaXM6Tm9kZSwgZXZ0OkV2ZW50KSA9PiBib29sZWFuKSAmIHtzb3VyY2U6IHN0cmluZ319IENvbmRpdGlvbmFsRnVuY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9sbEludGVydmFsXVxuICogQHByb3BlcnR5IHtDb25kaXRpb25hbEZ1bmN0aW9ufSBbZXZlbnRGaWx0ZXJdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjaGFuZ2VkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbb25jZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnN1bWVdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmcm9tXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Rocm90dGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9vdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyZXNob2xkXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tlbHQ6IEVsZW1lbnQsIG1lc3NhZ2U6IHN0cmluZywgdmFsaWRpdHk6IFZhbGlkaXR5U3RhdGV9fSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gSFgtUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlclxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlci1OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UYXJnZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIWC1DdXJyZW50LVVSTFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtIWC1Qcm9tcHRdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUJvb3N0ZWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0NvbnRlbnQtVHlwZV1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3RdXG4gKi9cblxuLyoqIEB0eXBlZGVmIEh0bXhBamF4SGVscGVyQ29udGV4dFxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3NvdXJjZV1cbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IFtldmVudF1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlVXJsUGFyYW1zXG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHBhcmFtZXRlcnMgZm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IHVuZmlsdGVyZWRGb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHVuZmlsdGVyZWRQYXJhbWV0ZXJzIHVuZmlsdGVyZWRGb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn0gaGVhZGVyc1xuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEBwcm9wZXJ0eSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpdGhDcmVkZW50aWFsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoXG4gKiBAcHJvcGVydHkge0V2ZW50fSB0cmlnZ2VyaW5nRXZlbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUluZm9cbiAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhFdGN9IGV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VsZWN0XG4gKiBAcHJvcGVydHkge3tyZXF1ZXN0UGF0aDogc3RyaW5nLCBmaW5hbFJlcXVlc3RQYXRoOiBzdHJpbmcsIHJlc3BvbnNlUGF0aDogc3RyaW5nfG51bGwsIGFuY2hvcjogc3RyaW5nfX0gcGF0aEluZm9cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N1Y2Nlc3NmdWxdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtrZWVwSW5kaWNhdG9yc11cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhBamF4RXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXR1cm5Qcm9taXNlXVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFt0YXJnZXRPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2RlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBzd2FwXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlcnJvcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtldmVudF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIdG14UmVzcG9uc2VJbmZvICYge3Nob3VsZFN3YXA6IGJvb2xlYW4sIHNlcnZlclJlc3BvbnNlOiBhbnksIGlzRXJyb3I6IGJvb2xlYW4sIGlnbm9yZVRpdGxlOiBib29sZWFuLCBzZWxlY3RPdmVycmlkZTpzdHJpbmd9fSBIdG14QmVmb3JlU3dhcERldGFpbHNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBIdG14QWpheEhhbmRsZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygoKSA9PiB2b2lkKX0gSHRteFNldHRsZVRhc2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhTZXR0bGVJbmZvXG4gKiBAcHJvcGVydHkge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gZWx0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aXRsZV1cbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgtZXh0ZW5zaW9ucy9ibG9iL21haW4vUkVBRE1FLm1kXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14RXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkgeyhhcGk6IGFueSkgPT4gdm9pZH0gaW5pdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnR8Q3VzdG9tRXZlbnQpID0+IGJvb2xlYW59IG9uRXZlbnRcbiAqIEBwcm9wZXJ0eSB7KHRleHQ6IHN0cmluZywgeGhyOiBYTUxIdHRwUmVxdWVzdCwgZWx0OiBFbGVtZW50KSA9PiBzdHJpbmd9IHRyYW5zZm9ybVJlc3BvbnNlXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpID0+IGJvb2xlYW59IGlzSW5saW5lU3dhcFxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLCB0YXJnZXQ6IE5vZGUsIGZyYWdtZW50OiBOb2RlLCBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbykgPT4gYm9vbGVhbnxOb2RlW119IGhhbmRsZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHhocjogWE1MSHR0cFJlcXVlc3QsIHBhcmFtZXRlcnM6IEZvcm1EYXRhLCBlbHQ6IE5vZGUpID0+ICp8c3RyaW5nfG51bGx9IGVuY29kZVBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nW118bnVsbH0gZ2V0U2VsZWN0b3JzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGh0bXhcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBkZXBlbmRzT24ocGF0aFNwZWM6IGFueSwgdXJsOiBzdHJpbmcpIHtcbiAgaWYgKHBhdGhTcGVjID09PSBcImlnbm9yZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGRlcGVuZGVuY3lQYXRoID0gcGF0aFNwZWMuc3BsaXQoXCIvXCIpO1xuICBjb25zdCB1cmxQYXRoID0gdXJsLnNwbGl0KFwiL1wiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeUVsZW1lbnQgPSBkZXBlbmRlbmN5UGF0aC5zaGlmdCgpO1xuICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gdXJsUGF0aFtpXTtcbiAgICBpZiAoZGVwZW5kZW5jeUVsZW1lbnQgIT09IHBhdGhFbGVtZW50ICYmIGRlcGVuZGVuY3lFbGVtZW50ICE9PSBcIipcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDAgfHxcbiAgICAgIChkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDEgJiYgZGVwZW5kZW5jeVBhdGhbMF0gPT09IFwiXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgZWx0c1dpdGhEZXBzID0gaHRteC5maW5kQWxsKFwiW3BhdGgtZGVwc11cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0c1dpdGhEZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZWx0ID0gZWx0c1dpdGhEZXBzW2ldO1xuICAgIGlmIChkZXBlbmRzT24oZWx0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSwgcGF0aCkpIHtcbiAgICAgIGh0bXgudHJpZ2dlcihlbHQsIFwicGF0aC1kZXBzXCIsIG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInBhdGgtZGVwc1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmJlZm9yZU9uTG9hZFwiKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBldnQuZGV0YWlsLnJlcXVlc3RDb25maWc7XG4gICAgICAvLyBtdXRhdGluZyBjYWxsXG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZyAmJlxuICAgICAgICBjb25maWcudmVyYiAhPT0gXCJnZXRcIiAmJlxuICAgICAgICBldnQudGFyZ2V0ICE9IG51bGwgJiZcbiAgICAgICAgZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgZXZ0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIikgIT09IFwiaWdub3JlXCJcbiAgICAgICkge1xuICAgICAgICByZWZyZXNoUGF0aChjb25maWcucGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCwge0h0bXhTZXR0bGVJbmZvLCBIdG14U3dhcFN0eWxlfSBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBldmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJztcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLnJlcGxhY2UoXCJoeC1vbjo6XCIsIFwiaHRteDpcIiksIGV2ZW50LmRldGFpbClcbiAgICAgICAgICAgICAgICAgICAgZS5kaXNwYXRjaEV2ZW50KG5ld0V2ZW50KVxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQuYWRkKGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4oZSBhcyBIVE1MRWxlbWVudCwgbmFtZSwgZXZlbnQsIHRyaWdnZXJlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJ0cmlnZ2VyLWNoaWxkcmVuXCIsIHtcbiAgICBvbkV2ZW50OiAobmFtZSwgZXZ0OiBFdmVudCB8IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKGV2dC5kZXRhaWwubWV0YSA9PT0gJ3RyaWdnZXItY2hpbGRyZW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJpZ2dlcmVkID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8fCBldnQuZGV0YWlsLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdHJpZ2dlckNoaWxkcmVuKHRhcmdldCwgbmFtZSwgZXZ0LCB0cmlnZ2VyZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGk6IGFueSk6IHZvaWQge1xuICAgIH0sXG4gICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uIChcbiAgICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgICB4aHI6IFhNTEh0dHBSZXF1ZXN0LFxuICAgICAgICBlbHQ6IEVsZW1lbnQsXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfSxcbiAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uIChzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgaGFuZGxlU3dhcDogZnVuY3Rpb24gKFxuICAgICAgICBzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsXG4gICAgICAgIHRhcmdldDogTm9kZSxcbiAgICAgICAgZnJhZ21lbnQ6IE5vZGUsXG4gICAgICAgIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvLFxuICAgICk6IGJvb2xlYW4gfCBOb2RlW10ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIHBhcmFtZXRlcnM6IEZvcm1EYXRhLFxuICAgICAgICBlbHQ6IE5vZGUsXG4gICAgKSB7XG4gICAgfSxcbiAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uICgpOiBzdHJpbmdbXSB8IG51bGwge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJkZWJ1Z1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmKG5hbWUgIT0gJ2h0bXg6d3NCZWZvcmVNZXNzYWdlJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIGlmIChjb25zb2xlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkRFQlVHOlwiLCBuYW1lLCBldnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub29wXG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmNvbnN0IGNvbmZpZzogYW55ID0gaHRteC5jb25maWc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHRteFwiKS5IdG14SW50ZXJuYWxBcGl9ICovXG5sZXQgYXBpOiBhbnk7XG5cbmNvbnN0IGF0dHJQcmVmaXggPSBcImh4LXRhcmdldC1cIjtcblxuLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgc3RyaW5nLnN0YXJ0c1dpdGhcbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXg7XG59XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0gcmVzcENvZGVOdW1iZXJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9XG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BDb2RlVGFyZ2V0KGVsdDogRWxlbWVudCwgcmVzcENvZGVOdW1iZXI6IG51bWJlcikge1xuICBpZiAoIWVsdCB8fCAhcmVzcENvZGVOdW1iZXIpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJlc3BDb2RlID0gcmVzcENvZGVOdW1iZXIudG9TdHJpbmcoKTtcblxuICAvLyAnKicgaXMgdGhlIG9yaWdpbmFsIHN5bnRheCwgYXMgdGhlIG9idmlvdXMgY2hhcmFjdGVyIGZvciBhIHdpbGRjYXJkLlxuICAvLyBUaGUgJ3gnIGFsdGVybmF0aXZlIHdhcyBhZGRlZCBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IHdpdGggSFRNTFxuICAvLyB0ZW1wbGF0aW5nIGVuZ2luZXMsIGR1ZSB0byBhbWJpZ3VpdHkgYXJvdW5kIHdoaWNoIGNoYXJhY3RlcnMgYXJlXG4gIC8vIHN1cHBvcnRlZCBpbiBIVE1MIGF0dHJpYnV0ZXMuXG4gIC8vXG4gIC8vIFN0YXJ0IHdpdGggdGhlIG1vc3Qgc3BlY2lmaWMgcG9zc2libGUgYXR0cmlidXRlIGFuZCBnZW5lcmFsaXplIGZyb21cbiAgLy8gdGhlcmUuXG4gIGNvbnN0IGF0dHJQb3NzaWJpbGl0aWVzID0gW1xuICAgIHJlc3BDb2RlLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCJ4XCIsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInhcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIioqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4eFwiLFxuXG4gICAgXCIqXCIsXG4gICAgXCJ4XCIsXG4gICAgXCIqKipcIixcbiAgICBcInh4eFwiLFxuICBdO1xuICBpZiAoc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI0XCIpIHx8IHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNVwiKSkge1xuICAgIGF0dHJQb3NzaWJpbGl0aWVzLnB1c2goXCJlcnJvclwiKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clBvc3NpYmlsaXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhdHRyID0gYXR0clByZWZpeCArIGF0dHJQb3NzaWJpbGl0aWVzW2ldO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGFwaS5nZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKTtcbiAgICBpZiAoYXR0clZhbHVlKSB7XG4gICAgICBpZiAoYXR0clZhbHVlID09PSBcInRoaXNcIikge1xuICAgICAgICByZXR1cm4gYXBpLmZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFwaS5xdWVyeVNlbGVjdG9yRXh0KGVsdCwgYXR0clZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEBwYXJhbSB7RXZlbnR9IGV2dCAqL1xuZnVuY3Rpb24gaGFuZGxlRXJyb3JGbGFnKGV2dDogQ3VzdG9tRXZlbnQpIHtcbiAgaWYgKGV2dC5kZXRhaWwuaXNFcnJvcikge1xuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvcikge1xuICAgICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvcikge1xuICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IHRydWU7XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJyZXNwb25zZS10YXJnZXRzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBpbml0OiAoYXBpUmVmKSA9PiB7XG4gICAgYXBpID0gYXBpUmVmO1xuXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbmFtZSA9PT0gXCJodG14OmJlZm9yZVN3YXBcIiAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyAhPT0gMjAwXG4gICAgKSB7XG4gICAgICBpZiAoZXZ0LmRldGFpbC50YXJnZXQpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZykge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciAmJlxuICAgICAgICAgIGV2dC5kZXRhaWwueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLm1hdGNoKC9IWC1SZXRhcmdldDovaSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFldnQuZGV0YWlsLnJlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRSZXNwQ29kZVRhcmdldChcbiAgICAgICAgZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnLmVsdCxcbiAgICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzLFxuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgIGV2dC5kZXRhaWwudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJtdXRhdGlvbi1lcnJvclwiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmFmdGVyUmVxdWVzdFwiKSB7XG4gICAgICBpZiAoIWV2dC5kZXRhaWwgfHwgIWV2dC5kZXRhaWwueGhyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXR1cyA9IGV2dC5kZXRhaWwueGhyLnN0YXR1cztcbiAgICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIGh0bXguZmluZEFsbChcIltoeC1vblxcXFw6XFxcXDptdXRhdGlvbi1lcnJvcl1cIikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBcImh0bXg6bXV0YXRpb24tZXJyb3JcIiwgeyBzdGF0dXMgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQge2NyZWF0ZVdlYlNvY2tldENsaWVudH0gZnJvbSBcIi4uL3V0aWwvd3NcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59IiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmNvbnN0IGV2YWxGdW5jUmVnZXggPS9fX2V2YWxfW0EtWmEtejAtOV0rXFwoW2Etel0rXFwpL2dtXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiaHRtZ29cIiwge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgaWYobmFtZSA9PT0gXCJodG14OmJlZm9yZUNsZWFudXBFbGVtZW50XCIgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICB9XG4gICAgfSxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcylcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgIGNvbnN0IG1hdGNoZXMgPSBhdHRyaWJ1dGUudmFsdWUubWF0Y2goZXZhbEZ1bmNSZWdleCkgfHwgW11cbiAgICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBtYXRjaC5yZXBsYWNlKFwiKClcIiwgXCJcIikucmVwbGFjZShcIih0aGlzKVwiLCBcIlwiKS5yZXBsYWNlKFwiO1wiLCBcIlwiKVxuICAgICAgICAgICAgY29uc3QgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgICAgICBpZihlbGUgJiYgZWxlLnRhZ05hbWUgPT09IFwiU0NSSVBUXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwicmVtb3ZpbmcgYXNzb2NpYXRlZCBzY3JpcHQgd2l0aCBpZFwiLCBpZClcbiAgICAgICAgICAgICAgICBlbGUucmVtb3ZlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gJ2h0bXgub3JnJ1xuaW1wb3J0IHtyZW1vdmVBc3NvY2lhdGVkU2NyaXB0c30gZnJvbSBcIi4vaHRtZ29cIjtcblxuXG5kZWNsYXJlIG1vZHVsZSAnaHRteC5vcmcnIHtcbiAgICBpbnRlcmZhY2UgSHRteCB7XG4gICAgICAgIGRlZmluZUV4dGVuc2lvbihuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogSHRteEV4dGVuc2lvbik6IHZvaWQ7XG4gICAgICAgIGNyZWF0ZVdlYlNvY2tldD86ICh1cmw6IHN0cmluZykgPT4gV2ViU29ja2V0O1xuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgIHdzUmVjb25uZWN0RGVsYXk/OiAnZnVsbC1qaXR0ZXInIHwgKChyZXRyeUNvdW50OiBudW1iZXIpID0+IG51bWJlcik7XG4gICAgICAgICAgICB3c0JpbmFyeVR5cGU/OiBzdHJpbmc7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICAgICAgfTtcbiAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIEh0bXhFeHRlbnNpb24ge1xuICAgIGluaXQ6IChhcGlSZWY6IEh0bXhJbnRlcm5hbEFwaSkgPT4gdm9pZDtcbiAgICBvbkV2ZW50OiAobmFtZTogc3RyaW5nLCBldnQ6IEV2ZW50KSA9PiB2b2lkO1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuaW50ZXJmYWNlIEh0bXhJbnRlcm5hbEFwaSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdDogRWxlbWVudCk6IGFueTtcbiAgICBib2R5Q29udGFpbnMoZWx0OiBFbGVtZW50KTogYm9vbGVhbjtcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQ6IEVsZW1lbnQsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGw7XG4gICAgdHJpZ2dlckV2ZW50KGVsdDogRWxlbWVudCwgbmFtZTogc3RyaW5nLCBkZXRhaWw/OiBhbnkpOiBib29sZWFuO1xuICAgIHdpdGhFeHRlbnNpb25zKGVsdDogRWxlbWVudCwgY2FsbGJhY2s6IChleHRlbnNpb246IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgbWFrZVNldHRsZUluZm8oZWx0OiBFbGVtZW50KTogYW55O1xuICAgIG1ha2VGcmFnbWVudChodG1sOiBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50O1xuICAgIG9vYlN3YXAoc3dhcFN0eWxlOiBzdHJpbmcsIGZyYWdtZW50OiBFbGVtZW50LCBzZXR0bGVJbmZvOiBhbnkpOiB2b2lkO1xuICAgIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzOiBhbnkpOiB2b2lkO1xuICAgIGdldENsb3Nlc3RNYXRjaChlbHQ6IEVsZW1lbnQsIGNvbmRpdGlvbjogKG5vZGU6IEVsZW1lbnQpID0+IGJvb2xlYW4pOiBFbGVtZW50IHwgbnVsbDtcbiAgICBnZXRUcmlnZ2VyU3BlY3MoZWx0OiBFbGVtZW50KTogYW55W107XG4gICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0OiBFbGVtZW50LCB0cmlnZ2VyU3BlYzogYW55LCBub2RlRGF0YTogYW55LCBoYW5kbGVyOiAoZWx0OiBFbGVtZW50LCBldnQ6IEV2ZW50KSA9PiB2b2lkKTogdm9pZDtcbiAgICBnZXRIZWFkZXJzKGVsdDogRWxlbWVudCwgdGFyZ2V0OiBFbGVtZW50KTogYW55O1xuICAgIGdldFRhcmdldChlbHQ6IEVsZW1lbnQpOiBFbGVtZW50O1xuICAgIGdldElucHV0VmFsdWVzKGVsdDogRWxlbWVudCwgdmVyYjogc3RyaW5nKTogeyBlcnJvcnM6IGFueVtdOyB2YWx1ZXM6IGFueSB9O1xuICAgIGdldEV4cHJlc3Npb25WYXJzKGVsdDogRWxlbWVudCk6IGFueTtcbiAgICBtZXJnZU9iamVjdHMob2JqMTogYW55LCBvYmoyOiBhbnkpOiBhbnk7XG4gICAgZmlsdGVyVmFsdWVzKHZhbHVlczogYW55LCBlbHQ6IEVsZW1lbnQpOiBhbnk7XG4gICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0PzogRWxlbWVudCwgbmFtZT86IHN0cmluZywgZGV0YWlsPzogYW55KTogdm9pZDtcbiAgICBoYXNBdHRyaWJ1dGUoZWx0OiBFbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIHNob3VsZENhbmNlbChldnQ6IEV2ZW50LCBlbHQ6IEVsZW1lbnQpOiBib29sZWFuO1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuaW50ZXJmYWNlIFdlYlNvY2tldFdyYXBwZXIge1xuICAgIHNvY2tldDogV2ViU29ja2V0O1xuICAgIGV2ZW50cyA6IHsgW2tleTogc3RyaW5nXTogKChldmVudDogRXZlbnQpID0+IHZvaWQpW10gfTtcbiAgICBtZXNzYWdlUXVldWU6IHsgbWVzc2FnZTogc3RyaW5nOyBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCB9W107XG4gICAgcmV0cnlDb3VudDogbnVtYmVyO1xuICAgIHNlbmRJbW1lZGlhdGVseShtZXNzYWdlOiBzdHJpbmcsIHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsKTogdm9pZDtcbiAgICBzZW5kKG1lc3NhZ2U6IHN0cmluZywgc2VuZEVsdDogRWxlbWVudCB8IG51bGwpOiB2b2lkO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKGV2ZW50OiBFdmVudCkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgaGFuZGxlUXVldWVkTWVzc2FnZXMoKTogdm9pZDtcbiAgICBpbml0KCk6IHZvaWQ7XG4gICAgY2xvc2UoKTogdm9pZDtcbiAgICBwdWJsaWNJbnRlcmZhY2U6IHtcbiAgICAgICAgc2VuZDogKG1lc3NhZ2U6IHN0cmluZywgc2VuZEVsdDogRWxlbWVudCB8IG51bGwpID0+IHZvaWQ7XG4gICAgICAgIHNlbmRJbW1lZGlhdGVseTogKG1lc3NhZ2U6IHN0cmluZywgc2VuZEVsdDogRWxlbWVudCB8IG51bGwpID0+IHZvaWQ7XG4gICAgICAgIHF1ZXVlOiB7IG1lc3NhZ2U6IHN0cmluZzsgc2VuZEVsdDogRWxlbWVudCB8IG51bGwgfVtdO1xuICAgIH07XG59XG5cbmxldCBhcGk6IEh0bXhJbnRlcm5hbEFwaTtcblxuZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xufVxuXG5mdW5jdGlvbiBnZXRMZWdhY3lXZWJzb2NrZXRVUkwoZWx0OiBFbGVtZW50KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsZWdhY3lTU0VWYWx1ZSA9IGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC13cycpO1xuICAgIGlmIChsZWdhY3lTU0VWYWx1ZSkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBzcGxpdE9uV2hpdGVzcGFjZShsZWdhY3lTU0VWYWx1ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tpXS5zcGxpdCgvOiguKykvKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZVswXSA9PT0gJ2Nvbm5lY3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVdlYlNvY2tldChzb2NrZXRFbHQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgLy8gSWYgdGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gbm8gbG9uZ2VyIGV4aXN0cywgdGhlblxuICAgIC8vIGRvIG5vdCBjb25uZWN0L3JlY29ubmVjdCB0aGUgV2ViU29ja2V0LlxuICAgIGlmICghYXBpLmJvZHlDb250YWlucyhzb2NrZXRFbHQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHNvdXJjZSBzdHJhaWdodCBmcm9tIHRoZSBlbGVtZW50J3MgdmFsdWVcbiAgICBsZXQgd3NzU291cmNlID0gYXBpLmdldEF0dHJpYnV0ZVZhbHVlKHNvY2tldEVsdCwgJ3dzLWNvbm5lY3QnKTtcblxuICAgIGlmICh3c3NTb3VyY2UgPT0gbnVsbCB8fCB3c3NTb3VyY2UgPT09ICcnKSB7XG4gICAgICAgIGNvbnN0IGxlZ2FjeVNvdXJjZSA9IGdldExlZ2FjeVdlYnNvY2tldFVSTChzb2NrZXRFbHQpO1xuICAgICAgICBpZiAobGVnYWN5U291cmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdzc1NvdXJjZSA9IGxlZ2FjeVNvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEd1YXJhbnRlZSB0aGF0IHRoZSB3c3NTb3VyY2UgdmFsdWUgaXMgYSBmdWxseSBxdWFsaWZpZWQgVVJMXG4gICAgaWYgKHdzc1NvdXJjZS5pbmRleE9mKCcvJykgPT09IDApIHtcbiAgICAgICAgY29uc3QgYmFzZV9wYXJ0ID0gbG9jYXRpb24uaG9zdG5hbWUgKyAobG9jYXRpb24ucG9ydCA/ICc6JyArIGxvY2F0aW9uLnBvcnQgOiAnJyk7XG4gICAgICAgIGlmIChsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgICAgICAgIHdzc1NvdXJjZSA9ICd3c3M6Ly8nICsgYmFzZV9wYXJ0ICsgd3NzU291cmNlO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cDonKSB7XG4gICAgICAgICAgICB3c3NTb3VyY2UgPSAnd3M6Ly8nICsgYmFzZV9wYXJ0ICsgd3NzU291cmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc29ja2V0V3JhcHBlciA9IGNyZWF0ZVdlYnNvY2tldFdyYXBwZXIoc29ja2V0RWx0LCAoKSA9PiBodG14LmNyZWF0ZVdlYlNvY2tldCEod3NzU291cmNlKSk7XG5cbiAgICBzb2NrZXRXcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKG1heWJlQ2xvc2VXZWJTb2NrZXRTb3VyY2Uoc29ja2V0RWx0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlID0gKGV2ZW50IGFzIE1lc3NhZ2VFdmVudCkuZGF0YTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWFwaS50cmlnZ2VyRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c0JlZm9yZU1lc3NhZ2UnLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgc29ja2V0V3JhcHBlcjogc29ja2V0V3JhcHBlci5wdWJsaWNJbnRlcmZhY2UsXG4gICAgICAgICAgICB9KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwaS53aXRoRXh0ZW5zaW9ucyhzb2NrZXRFbHQsIChleHRlbnNpb24pID0+IHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHJlc3BvbnNlLCBudWxsLCBzb2NrZXRFbHQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gYXBpLm1ha2VTZXR0bGVJbmZvKHNvY2tldEVsdCk7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSk7XG5cbiAgICAgICAgaWYgKGZyYWdtZW50LmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldXG4gICAgICAgICAgICAgICAgYXBpLm9vYlN3YXAoYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGNoaWxkLCAnaHgtc3dhcC1vb2InKSB8fCAndHJ1ZScsIGNoaWxkcmVuW2ldLCBzZXR0bGVJbmZvKTtcbiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGh0bWdvIGV2YWxfXyBzY3JpcHRzXG4gICAgICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgY2hpbGQuaWQuc3RhcnRzV2l0aChcIl9fZXZhbFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhcGkuc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcyk7XG4gICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c0FmdGVyTWVzc2FnZScsIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLFxuICAgICAgICAgICAgc29ja2V0V3JhcHBlcjogc29ja2V0V3JhcHBlci5wdWJsaWNJbnRlcmZhY2UsXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gUHV0IHRoZSBXZWJTb2NrZXQgaW50byB0aGUgSFRNTCBFbGVtZW50J3MgY3VzdG9tIGRhdGEuXG4gICAgYXBpLmdldEludGVybmFsRGF0YShzb2NrZXRFbHQpLndlYlNvY2tldCA9IHNvY2tldFdyYXBwZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVdlYnNvY2tldFdyYXBwZXIoc29ja2V0RWx0OiBIVE1MRWxlbWVudCwgc29ja2V0RnVuYzogKCkgPT4gV2ViU29ja2V0KTogV2ViU29ja2V0V3JhcHBlciB7XG4gICAgY29uc3Qgd3JhcHBlcjogV2ViU29ja2V0V3JhcHBlciA9IHtcbiAgICAgICAgc29ja2V0OiBudWxsIGFzIHVua25vd24gYXMgV2ViU29ja2V0LFxuICAgICAgICBtZXNzYWdlUXVldWU6IFtdLFxuICAgICAgICByZXRyeUNvdW50OiAwLFxuICAgICAgICBldmVudHM6IHt9IGFzIHsgW2tleTogc3RyaW5nXTogKChldmVudDogRXZlbnQpID0+IHZvaWQpW10gfSxcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmV2ZW50c1tldmVudF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50c1tldmVudF0gPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ldmVudHNbZXZlbnRdLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH0sXG4gICAgICAgIHNlbmRJbW1lZGlhdGVseShtZXNzYWdlOiBzdHJpbmcsIHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc29ja2V0KSB7XG4gICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFcnJvckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NFcnJvcicsIHsgZXJyb3I6ICdObyBzb2NrZXQgYXZhaWxhYmxlJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhc2VuZEVsdCB8fFxuICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoc2VuZEVsdCwgJ2h0bXg6d3NCZWZvcmVTZW5kJywge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBzb2NrZXRXcmFwcGVyOiB0aGlzLnB1YmxpY0ludGVyZmFjZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VuZEVsdCkge1xuICAgICAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckV2ZW50KHNlbmRFbHQsICdodG14OndzQWZ0ZXJTZW5kJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldFdyYXBwZXI6IHRoaXMucHVibGljSW50ZXJmYWNlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNlbmQobWVzc2FnZTogc3RyaW5nLCBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IHRoaXMuc29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VRdWV1ZS5wdXNoKHsgbWVzc2FnZSwgc2VuZEVsdCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kSW1tZWRpYXRlbHkobWVzc2FnZSwgc2VuZEVsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGhhbmRsZVF1ZXVlZE1lc3NhZ2VzKCkge1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMubWVzc2FnZVF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZWRJdGVtID0gdGhpcy5tZXNzYWdlUXVldWVbMF07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kSW1tZWRpYXRlbHkocXVldWVkSXRlbS5tZXNzYWdlLCBxdWV1ZWRJdGVtLnNlbmRFbHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xvc2UgZGlzY2FyZGVkIHNvY2tldFxuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBXZWJTb2NrZXQgYW5kIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgICAgICBjb25zdCBzb2NrZXQgPSBzb2NrZXRGdW5jKCk7XG5cbiAgICAgICAgICAgIC8vIFRoZSBldmVudC50eXBlIGRldGFpbCBpcyBhZGRlZCBmb3IgaW50ZXJmYWNlIGNvbmZvcm1hbmNlIHdpdGggdGhlXG4gICAgICAgICAgICAvLyBvdGhlciB0d28gbGlmZWN5Y2xlIGV2ZW50cyAob3BlbiBhbmQgY2xvc2UpIHNvIGEgc2luZ2xlIGhhbmRsZXIgbWV0aG9kXG4gICAgICAgICAgICAvLyBjYW4gaGFuZGxlIHRoZW0gcG9seW1vcnBoaWNhbGx5LCBpZiByZXF1aXJlZC5cbiAgICAgICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c0Nvbm5lY3RpbmcnLCB7IGV2ZW50OiB7IHR5cGU6ICdjb25uZWN0aW5nJyB9IH0pO1xuXG4gICAgICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcblxuICAgICAgICAgICAgc29ja2V0Lm9ub3BlbiA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXRyeUNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NPcGVuJywgeyBldmVudDogZSwgc29ja2V0V3JhcHBlcjogdGhpcy5wdWJsaWNJbnRlcmZhY2UgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVRdWV1ZWRNZXNzYWdlcygpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIElmIHNvY2tldCBzaG91bGQgbm90IGJlIGNvbm5lY3RlZCwgc3RvcCBmdXJ0aGVyIGF0dGVtcHRzIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgLy8gSWYgQWJub3JtYWwgQ2xvc3VyZS9TZXJ2aWNlIFJlc3RhcnQvVHJ5IEFnYWluIExhdGVyLCB0aGVuIHNldCBhIHRpbWVyIHRvIHJlY29ubmVjdCBhZnRlciBhIHBhdXNlLlxuICAgICAgICAgICAgICAgIGlmICghbWF5YmVDbG9zZVdlYlNvY2tldFNvdXJjZShzb2NrZXRFbHQpICYmIFsxMDA2LCAxMDEyLCAxMDEzXS5pbmRleE9mKGUuY29kZSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxheSA9IGdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KHRoaXMucmV0cnlDb3VudCk7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXRyeUNvdW50ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5vdGlmeSBjbGllbnQgY29kZSB0aGF0IGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkLiBDbGllbnQgY29kZSBjYW4gaW5zcGVjdCBgZXZlbnRgIGZpZWxkXG4gICAgICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgY2xvc3VyZSBoYXMgYmVlbiB2YWxpZCBvciBhYm5vcm1hbFxuICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c0Nsb3NlJywgeyBldmVudDogZSwgc29ja2V0V3JhcHBlcjogdGhpcy5wdWJsaWNJbnRlcmZhY2UgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzb2NrZXQub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFcnJvckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NFcnJvcicsIHsgZXJyb3I6IGUsIHNvY2tldFdyYXBwZXI6IHRoaXMgfSk7XG4gICAgICAgICAgICAgICAgbWF5YmVDbG9zZVdlYlNvY2tldFNvdXJjZShzb2NrZXRFbHQpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5ldmVudHM7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhldmVudHMpLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgICAgICAgICBldmVudHNba10uZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihrLCBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbG9zZSgpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHB1YmxpY0ludGVyZmFjZToge30gYXMgYW55LFxuICAgIH07XG5cbiAgICB3cmFwcGVyLmluaXQoKTtcblxuICAgIHdyYXBwZXIucHVibGljSW50ZXJmYWNlID0ge1xuICAgICAgICBzZW5kOiB3cmFwcGVyLnNlbmQuYmluZCh3cmFwcGVyKSxcbiAgICAgICAgc2VuZEltbWVkaWF0ZWx5OiB3cmFwcGVyLnNlbmRJbW1lZGlhdGVseS5iaW5kKHdyYXBwZXIpLFxuICAgICAgICBxdWV1ZTogd3JhcHBlci5tZXNzYWdlUXVldWUsXG4gICAgfTtcblxuICAgIHJldHVybiB3cmFwcGVyO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVXZWJTb2NrZXRTZW5kKGVsdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBsZWdhY3lBdHRyaWJ1dGUgPSBhcGkuZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtd3MnKTtcbiAgICBpZiAobGVnYWN5QXR0cmlidXRlICYmIGxlZ2FjeUF0dHJpYnV0ZSAhPT0gJ3NlbmQnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJTb2NrZXRQYXJlbnQgPSBhcGkuZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgaGFzV2ViU29ja2V0KTtcbiAgICBpZiAod2ViU29ja2V0UGFyZW50KSB7XG4gICAgICAgIHByb2Nlc3NXZWJTb2NrZXRTZW5kKHdlYlNvY2tldFBhcmVudCBhcyBIVE1MRWxlbWVudCwgZWx0KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGhhc1dlYlNvY2tldChub2RlOiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhcGkuZ2V0SW50ZXJuYWxEYXRhKG5vZGUpLndlYlNvY2tldCAhPSBudWxsO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzV2ViU29ja2V0U2VuZChzb2NrZXRFbHQ6IEhUTUxFbGVtZW50LCBzZW5kRWx0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gYXBpLmdldEludGVybmFsRGF0YShzZW5kRWx0KTtcbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBhcGkuZ2V0VHJpZ2dlclNwZWNzKHNlbmRFbHQpO1xuICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKCh0cykgPT4ge1xuICAgICAgICBhcGkuYWRkVHJpZ2dlckhhbmRsZXIoc2VuZEVsdCwgdHMsIG5vZGVEYXRhLCAoZWx0OiBFbGVtZW50LCBldnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAobWF5YmVDbG9zZVdlYlNvY2tldFNvdXJjZShzb2NrZXRFbHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb2NrZXRXcmFwcGVyOiBXZWJTb2NrZXRXcmFwcGVyID0gYXBpLmdldEludGVybmFsRGF0YShzb2NrZXRFbHQpLndlYlNvY2tldDtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhcGkuZ2V0SGVhZGVycyhzZW5kRWx0LCBhcGkuZ2V0VGFyZ2V0KHNlbmRFbHQpKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhcGkuZ2V0SW5wdXRWYWx1ZXMoc2VuZEVsdCwgJ3Bvc3QnKTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3VsdHMuZXJyb3JzO1xuICAgICAgICAgICAgY29uc3QgcmF3UGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHJlc3VsdHMudmFsdWVzKTtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gYXBpLmdldEV4cHJlc3Npb25WYXJzKHNlbmRFbHQpO1xuICAgICAgICAgICAgY29uc3QgYWxsUGFyYW1ldGVycyA9IGFwaS5tZXJnZU9iamVjdHMocmF3UGFyYW1ldGVycywgZXhwcmVzc2lvblZhcnMpO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQYXJhbWV0ZXJzID0gYXBpLmZpbHRlclZhbHVlcyhhbGxQYXJhbWV0ZXJzLCBzZW5kRWx0KTtcblxuICAgICAgICAgICAgY29uc3Qgc2VuZENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBmaWx0ZXJlZFBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGFsbFBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICBlcnJvcnMsXG5cbiAgICAgICAgICAgICAgICB0cmlnZ2VyaW5nRXZlbnQ6IGV2dCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlQm9keTogdW5kZWZpbmVkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzb2NrZXRXcmFwcGVyOiBzb2NrZXRXcmFwcGVyLnB1YmxpY0ludGVyZmFjZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICghYXBpLnRyaWdnZXJFdmVudChlbHQsICdodG14OndzQ29uZmlnU2VuZCcsIHNlbmRDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgZXJyb3JzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBib2R5ID0gc2VuZENvbmZpZy5tZXNzYWdlQm9keTtcbiAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b1NlbmQgPSBPYmplY3QuYXNzaWduKHt9LCBzZW5kQ29uZmlnLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgIGlmIChzZW5kQ29uZmlnLmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9TZW5kLkhFQURFUlMgPSBoZWFkZXJzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkodG9TZW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc29ja2V0V3JhcHBlci5zZW5kKGJvZHksIGVsdCBhcyBFbGVtZW50KTtcblxuICAgICAgICAgICAgaWYgKGV2dCAmJiBhcGkuc2hvdWxkQ2FuY2VsKGV2dCwgZWx0IGFzIEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheShyZXRyeUNvdW50OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGRlbGF5ID0gaHRteC5jb25maWcud3NSZWNvbm5lY3REZWxheTtcbiAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBkZWxheShyZXRyeUNvdW50KTtcbiAgICB9XG4gICAgaWYgKGRlbGF5ID09PSAnZnVsbC1qaXR0ZXInKSB7XG4gICAgICAgIGNvbnN0IGV4cCA9IE1hdGgubWluKHJldHJ5Q291bnQsIDYpO1xuICAgICAgICBjb25zdCBtYXhEZWxheSA9IDEwMDAgKiBNYXRoLnBvdygyLCBleHApO1xuICAgICAgICByZXR1cm4gbWF4RGVsYXkgKiBNYXRoLnJhbmRvbSgpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gbWF5YmVDbG9zZVdlYlNvY2tldFNvdXJjZShlbHQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKCFhcGkuYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgYXBpLmdldEludGVybmFsRGF0YShlbHQpLndlYlNvY2tldC5jbG9zZSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXQodXJsOiBzdHJpbmcpOiBXZWJTb2NrZXQge1xuICAgIGNvbnN0IHNvY2sgPSBuZXcgV2ViU29ja2V0KHVybCwgW10pO1xuICAgIHNvY2suYmluYXJ5VHlwZSA9IChodG14LmNvbmZpZy53c0JpbmFyeVR5cGUgfHwgJ2Jsb2InKSBhcyB1bmtub3duIGFzIEJpbmFyeVR5cGU7XG4gICAgcmV0dXJuIHNvY2s7XG59XG5cbmZ1bmN0aW9uIHF1ZXJ5QXR0cmlidXRlT25UaGlzT3JDaGlsZHJlbihlbHQ6IEhUTUxFbGVtZW50LCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudFtdIHtcbiAgICBjb25zdCByZXN1bHQ6IEhUTUxFbGVtZW50W10gPSBbXTtcblxuICAgIC8vIElmIHRoZSBwYXJlbnQgZWxlbWVudCBhbHNvIGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlLCB0aGVuIGFkZCBpdCB0byB0aGUgcmVzdWx0cyB0b28uXG4gICAgaWYgKGFwaS5oYXNBdHRyaWJ1dGUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB8fCBhcGkuaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXdzJykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZWx0KTtcbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggYWxsIGNoaWxkIG5vZGVzIHRoYXQgbWF0Y2ggdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVcbiAgICBlbHQucXVlcnlTZWxlY3RvckFsbCgnWycgKyBhdHRyaWJ1dGVOYW1lICsgJ10sIFtkYXRhLScgKyBhdHRyaWJ1dGVOYW1lICsgJ10sIFtkYXRhLWh4LXdzXSwgW2h4LXdzXScpLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgcmVzdWx0LnB1c2gobm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JFYWNoPFQ+KGFycjogVFtdLCBmdW5jOiAoaXRlbTogVCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmIChhcnIpIHtcbiAgICAgICAgYXJyLmZvckVhY2goZnVuYyk7XG4gICAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbignd3MnLCB7XG4gICAgaW5pdDogKGFwaVJlZjogSHRteEludGVybmFsQXBpKSA9PiB7XG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSB0byBpbnRlcm5hbCBBUElcbiAgICAgICAgYXBpID0gYXBpUmVmO1xuXG4gICAgICAgIC8vIERlZmF1bHQgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBXZWJTb2NrZXQgb2JqZWN0c1xuICAgICAgICBpZiAoIWh0bXguY3JlYXRlV2ViU29ja2V0KSB7XG4gICAgICAgICAgICBodG14LmNyZWF0ZVdlYlNvY2tldCA9IGNyZWF0ZVdlYlNvY2tldDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgc2V0dGluZyBmb3IgcmVjb25uZWN0IGRlbGF5XG4gICAgICAgIGlmICghaHRteC5jb25maWcud3NSZWNvbm5lY3REZWxheSkge1xuICAgICAgICAgICAgaHRteC5jb25maWcud3NSZWNvbm5lY3REZWxheSA9ICdmdWxsLWppdHRlcic7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgb25FdmVudDogKG5hbWU6IHN0cmluZywgZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBwYXJlbnQ6IEVsZW1lbnQgPSBldnQudGFyZ2V0IGFzIEVsZW1lbnQgfHwgKGV2dCBhcyBDdXN0b21FdmVudCkuZGV0YWlsLmVsdDtcblxuICAgICAgICBpZighKHBhcmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBjbG9zZSB0aGUgc29ja2V0IHdoZW4gZWxlbWVudHMgYXJlIHJlbW92ZWRcbiAgICAgICAgICAgIGNhc2UgJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnOlxuICAgICAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gYXBpLmdldEludGVybmFsRGF0YShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbERhdGEud2ViU29ja2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGludGVybmFsRGF0YS53ZWJTb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIHdlYnNvY2tldHMgd2hlbiBlbGVtZW50cyBhcmUgcHJvY2Vzc2VkXG4gICAgICAgICAgICBjYXNlICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJzpcbiAgICAgICAgICAgICAgICBmb3JFYWNoKHF1ZXJ5QXR0cmlidXRlT25UaGlzT3JDaGlsZHJlbihwYXJlbnQsICd3cy1jb25uZWN0JyksIChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbnN1cmVXZWJTb2NrZXQoY2hpbGQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZvckVhY2gocXVlcnlBdHRyaWJ1dGVPblRoaXNPckNoaWxkcmVuKHBhcmVudCwgJ3dzLXNlbmQnKSwgKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVuc3VyZVdlYlNvY2tldFNlbmQoY2hpbGQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3BhdGhkZXBzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3RyaWdnZXItY2hpbGRyZW5cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvZGVidWdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcmVzcG9uc2UtdGFyZ2V0c1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9tdXRhdGlvbi1lcnJvclwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkXCJcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvaHRtZ29cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvd3NcIlxuXG5mdW5jdGlvbiB3YXRjaFVybChjYWxsYmFjazogKG9sZFVybDogc3RyaW5nLCBuZXdVcmw6IHN0cmluZykgPT4gdm9pZCkge1xuICBsZXQgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBsYXN0VXJsKSB7XG4gICAgICBjYWxsYmFjayhsYXN0VXJsLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuICB9LCAxMDApO1xufVxuXG53YXRjaFVybCgoXywgbmV3VXJsKSA9PiB7XG4gIG9uVXJsQ2hhbmdlKG5ld1VybCk7XG59KTtcblxuZnVuY3Rpb24gb25VcmxDaGFuZ2UobmV3VXJsOiBzdHJpbmcpIHtcbiAgbGV0IHVybCA9IG5ldyBVUkwobmV3VXJsKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXJdXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtdHJpZ2dlclwiKTtcbiAgICBpZiAoIXRyaWdnZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gdHJpZ2dlcnMuc3BsaXQoXCIsIFwiKTtcbiAgICBpZiAoc3BsaXQuZmluZCgocykgPT4gcyA9PT0gXCJ1cmxcIikpIHtcbiAgICAgIGh0bXguc3dhcChlbGVtZW50LCBcInVybFwiLCB7XG4gICAgICAgIHN3YXBTdHlsZTogXCJvdXRlckhUTUxcIixcbiAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZXNdIG9mIHVybC5zZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgbGV0IGV2ZW50TmFtZSA9IFwicXM6XCIgKyBrZXk7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5pbmNsdWRlcyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0cmlnZ2VyaW5nXCIsIGV2ZW50TmFtZSk7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIGV2ZW50TmFtZSwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtbWF0Y2gtcXBdXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBlbC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIikpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5yZXBsYWNlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiwgXCJcIik7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KG1hdGNoKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgaHRteC5zd2FwKGVsLCBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgPz8gXCJcIiwge1xuICAgICAgICAgICAgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLFxuICAgICAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGFzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzTWF0Y2gpIHtcbiAgICAgIGxldCBkZWZhdWx0S2V5ID0gZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtZGVmYXVsdFwiKTtcbiAgICAgIGlmIChkZWZhdWx0S2V5KSB7XG4gICAgICAgIGh0bXguc3dhcChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiICsgZGVmYXVsdEtleSkgPz8gXCJcIixcbiAgICAgICAgICB7IHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIiwgc3dhcERlbGF5OiAwLCBzZXR0bGVEZWxheTogMCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iXX0= \ No newline at end of file diff --git a/framework/assets/js/htmgo.ts b/framework/assets/js/htmgo.ts index 58c1fc6..aee46a3 100644 --- a/framework/assets/js/htmgo.ts +++ b/framework/assets/js/htmgo.ts @@ -6,6 +6,7 @@ import "./htmxextensions/response-targets"; import "./htmxextensions/mutation-error"; import "./htmxextensions/livereload" import "./htmxextensions/htmgo"; +import "./htmxextensions/ws" function watchUrl(callback: (oldUrl: string, newUrl: string) => void) { let lastUrl = window.location.href; diff --git a/framework/assets/js/htmxextensions/debug.ts b/framework/assets/js/htmxextensions/debug.ts index 90a841f..772f86d 100644 --- a/framework/assets/js/htmxextensions/debug.ts +++ b/framework/assets/js/htmxextensions/debug.ts @@ -3,10 +3,13 @@ import htmx from "htmx.org"; htmx.defineExtension("debug", { // @ts-ignore onEvent: function (name, evt) { + if(name != 'htmx:wsBeforeMessage') { + return + } if (console.debug) { - console.debug(name); + console.debug(name, evt); } else if (console) { - console.log("DEBUG:", name); + console.log("DEBUG:", name, evt); } else { // noop } diff --git a/framework/assets/js/htmxextensions/htmgo.ts b/framework/assets/js/htmxextensions/htmgo.ts index ace09b3..6b0ae7e 100644 --- a/framework/assets/js/htmxextensions/htmgo.ts +++ b/framework/assets/js/htmxextensions/htmgo.ts @@ -1,6 +1,6 @@ import htmx from "htmx.org"; -const evalFuncRegex = /__eval_[A-Za-z0-9]+\(\)/gm +const evalFuncRegex =/__eval_[A-Za-z0-9]+\([a-z]+\)/gm htmx.defineExtension("htmgo", { // @ts-ignore @@ -11,16 +11,17 @@ htmx.defineExtension("htmgo", { }, }); -function removeAssociatedScripts(element: HTMLElement) { +export function removeAssociatedScripts(element: HTMLElement) { const attributes = Array.from(element.attributes) for (let attribute of attributes) { const matches = attribute.value.match(evalFuncRegex) || [] for (let match of matches) { - const id = match.replace("()", "") + const id = match.replace("()", "").replace("(this)", "").replace(";", "") const ele = document.getElementById(id) if(ele && ele.tagName === "SCRIPT") { + console.debug("removing associated script with id", id) ele.remove() } } } -} \ No newline at end of file +} diff --git a/framework/assets/js/htmxextensions/trigger-children.ts b/framework/assets/js/htmxextensions/trigger-children.ts index f57e4a5..7b30f44 100644 --- a/framework/assets/js/htmxextensions/trigger-children.ts +++ b/framework/assets/js/htmxextensions/trigger-children.ts @@ -1,43 +1,82 @@ -import htmx, { HtmxSettleInfo, HtmxSwapStyle } from "htmx.org"; +import htmx, {HtmxSettleInfo, HtmxSwapStyle} from "htmx.org"; + +function kebabEventName(str: string) { + return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase() +} + +function makeEvent(eventName: string, detail: any) { + let evt + if (window.CustomEvent && typeof window.CustomEvent === 'function') { + // TODO: `composed: true` here is a hack to make global event handlers work with events in shadow DOM + evt = new CustomEvent(eventName, { bubbles: false, cancelable: true, composed: true, detail }) + } else { + evt = document.createEvent('CustomEvent') + evt.initCustomEvent(eventName, true, true, detail) + } + return evt +} + +function triggerChildren(target: HTMLElement, name: string, event: CustomEvent, triggered: Set) { + event.detail.meta = 'trigger-children'; + if (target && target.children) { + Array.from(target.children).forEach((e) => { + const kehab = kebabEventName(name); + const eventName = kehab.replace("htmx:", "hx-on::") + if (!triggered.has(e as HTMLElement)) { + if(e.hasAttribute(eventName)) { + const newEvent = makeEvent(eventName.replace("hx-on::", "htmx:"), event.detail) + e.dispatchEvent(newEvent) + triggered.add(e as HTMLElement); + } + if (e.children) { + triggerChildren(e as HTMLElement, name, event, triggered); + } + } + }); + } +} + htmx.defineExtension("trigger-children", { - onEvent: (name, evt: Event | CustomEvent) => { - if (!(evt instanceof CustomEvent)) { - return false; - } - const target = evt.detail.target as HTMLElement; - if (target && target.children) { - Array.from(target.children).forEach((e) => { - htmx.trigger(e, name, null); - }); - } - return true; - }, - init: function (api: any): void {}, - transformResponse: function ( - text: string, - xhr: XMLHttpRequest, - elt: Element, - ): string { - return text; - }, - isInlineSwap: function (swapStyle: HtmxSwapStyle): boolean { - return false; - }, - handleSwap: function ( - swapStyle: HtmxSwapStyle, - target: Node, - fragment: Node, - settleInfo: HtmxSettleInfo, - ): boolean | Node[] { - return false; - }, - encodeParameters: function ( - xhr: XMLHttpRequest, - parameters: FormData, - elt: Node, - ) {}, - getSelectors: function (): string[] | null { - return null; - }, + onEvent: (name, evt: Event | CustomEvent) => { + if (!(evt instanceof CustomEvent)) { + return false; + } + if(evt.detail.meta === 'trigger-children') { + return false; + } + const triggered = new Set(); + const target = evt.target as HTMLElement || evt.detail.target as HTMLElement; + triggerChildren(target, name, evt, triggered); + return true; + }, + init: function (api: any): void { + }, + transformResponse: function ( + text: string, + xhr: XMLHttpRequest, + elt: Element, + ): string { + return text; + }, + isInlineSwap: function (swapStyle: HtmxSwapStyle): boolean { + return false; + }, + handleSwap: function ( + swapStyle: HtmxSwapStyle, + target: Node, + fragment: Node, + settleInfo: HtmxSettleInfo, + ): boolean | Node[] { + return false; + }, + encodeParameters: function ( + xhr: XMLHttpRequest, + parameters: FormData, + elt: Node, + ) { + }, + getSelectors: function (): string[] | null { + return null; + }, }); diff --git a/framework/assets/js/htmxextensions/ws.ts b/framework/assets/js/htmxextensions/ws.ts new file mode 100644 index 0000000..76dfb6c --- /dev/null +++ b/framework/assets/js/htmxextensions/ws.ts @@ -0,0 +1,449 @@ +import htmx from 'htmx.org' +import {removeAssociatedScripts} from "./htmgo"; + + +declare module 'htmx.org' { + interface Htmx { + defineExtension(name: string, extension: HtmxExtension): void; + createWebSocket?: (url: string) => WebSocket; + config: { + wsReconnectDelay?: 'full-jitter' | ((retryCount: number) => number); + wsBinaryType?: string; + [key: string]: any + }; + [key: string]: any; + } +} + +interface HtmxExtension { + init: (apiRef: HtmxInternalApi) => void; + onEvent: (name: string, evt: Event) => void; + [key: string]: any; +} + +interface HtmxInternalApi { + getInternalData(elt: Element): any; + bodyContains(elt: Element): boolean; + getAttributeValue(elt: Element, name: string): string | null; + triggerEvent(elt: Element, name: string, detail?: any): boolean; + withExtensions(elt: Element, callback: (extension: any) => void): void; + makeSettleInfo(elt: Element): any; + makeFragment(html: string): DocumentFragment; + oobSwap(swapStyle: string, fragment: Element, settleInfo: any): void; + settleImmediately(tasks: any): void; + getClosestMatch(elt: Element, condition: (node: Element) => boolean): Element | null; + getTriggerSpecs(elt: Element): any[]; + addTriggerHandler(elt: Element, triggerSpec: any, nodeData: any, handler: (elt: Element, evt: Event) => void): void; + getHeaders(elt: Element, target: Element): any; + getTarget(elt: Element): Element; + getInputValues(elt: Element, verb: string): { errors: any[]; values: any }; + getExpressionVars(elt: Element): any; + mergeObjects(obj1: any, obj2: any): any; + filterValues(values: any, elt: Element): any; + triggerErrorEvent(elt?: Element, name?: string, detail?: any): void; + hasAttribute(elt: Element, name: string): boolean; + shouldCancel(evt: Event, elt: Element): boolean; + [key: string]: any; +} + +interface WebSocketWrapper { + socket: WebSocket; + events : { [key: string]: ((event: Event) => void)[] }; + messageQueue: { message: string; sendElt: Element | null }[]; + retryCount: number; + sendImmediately(message: string, sendElt: Element | null): void; + send(message: string, sendElt: Element | null): void; + addEventListener(event: string, handler: (event: Event) => void): void; + handleQueuedMessages(): void; + init(): void; + close(): void; + publicInterface: { + send: (message: string, sendElt: Element | null) => void; + sendImmediately: (message: string, sendElt: Element | null) => void; + queue: { message: string; sendElt: Element | null }[]; + }; +} + +let api: HtmxInternalApi; + +function splitOnWhitespace(trigger: string): string[] { + return trigger.trim().split(/\s+/); +} + +function getLegacyWebsocketURL(elt: Element): string | undefined { + const legacySSEValue = api.getAttributeValue(elt, 'hx-ws'); + if (legacySSEValue) { + const values = splitOnWhitespace(legacySSEValue); + for (let i = 0; i < values.length; i++) { + const value = values[i].split(/:(.+)/); + if (value[0] === 'connect') { + return value[1]; + } + } + } + return undefined; +} + +function ensureWebSocket(socketElt: HTMLElement): void { + // If the element containing the WebSocket connection no longer exists, then + // do not connect/reconnect the WebSocket. + if (!api.bodyContains(socketElt)) { + return; + } + + // Get the source straight from the element's value + let wssSource = api.getAttributeValue(socketElt, 'ws-connect'); + + if (wssSource == null || wssSource === '') { + const legacySource = getLegacyWebsocketURL(socketElt); + if (legacySource == null) { + return; + } else { + wssSource = legacySource; + } + } + + // Guarantee that the wssSource value is a fully qualified URL + if (wssSource.indexOf('/') === 0) { + const base_part = location.hostname + (location.port ? ':' + location.port : ''); + if (location.protocol === 'https:') { + wssSource = 'wss://' + base_part + wssSource; + } else if (location.protocol === 'http:') { + wssSource = 'ws://' + base_part + wssSource; + } + } + + const socketWrapper = createWebsocketWrapper(socketElt, () => htmx.createWebSocket!(wssSource)); + + socketWrapper.addEventListener('message', (event) => { + if (maybeCloseWebSocketSource(socketElt)) { + return; + } + + let response = (event as MessageEvent).data; + if ( + !api.triggerEvent(socketElt, 'htmx:wsBeforeMessage', { + message: response, + socketWrapper: socketWrapper.publicInterface, + }) + ) { + return; + } + + api.withExtensions(socketElt, (extension) => { + response = extension.transformResponse(response, null, socketElt); + }); + + const settleInfo = api.makeSettleInfo(socketElt); + const fragment = api.makeFragment(response); + + if (fragment.children.length) { + const children = Array.from(fragment.children); + for (let i = 0; i < children.length; i++) { + const child = children[i] + api.oobSwap(api.getAttributeValue(child, 'hx-swap-oob') || 'true', children[i], settleInfo); + // support htmgo eval__ scripts + if(child.tagName === 'SCRIPT' && child.id.startsWith("__eval")) { + document.body.appendChild(child); + } + } + } + + api.settleImmediately(settleInfo.tasks); + api.triggerEvent(socketElt, 'htmx:wsAfterMessage', { + message: response, + socketWrapper: socketWrapper.publicInterface, + }); + }); + + // Put the WebSocket into the HTML Element's custom data. + api.getInternalData(socketElt).webSocket = socketWrapper; +} + +function createWebsocketWrapper(socketElt: HTMLElement, socketFunc: () => WebSocket): WebSocketWrapper { + const wrapper: WebSocketWrapper = { + socket: null as unknown as WebSocket, + messageQueue: [], + retryCount: 0, + events: {} as { [key: string]: ((event: Event) => void)[] }, + addEventListener(event: string, handler: (event: Event) => void) { + if (this.socket) { + this.socket.addEventListener(event, handler); + } + + if (!this.events[event]) { + this.events[event] = []; + } + + this.events[event].push(handler); + }, + sendImmediately(message: string, sendElt: Element | null) { + if (!this.socket) { + api.triggerErrorEvent(socketElt, 'htmx:wsError', { error: 'No socket available' }); + } + if ( + !sendElt || + api.triggerEvent(sendElt, 'htmx:wsBeforeSend', { + message, + socketWrapper: this.publicInterface, + }) + ) { + this.socket.send(message); + if (sendElt) { + api.triggerEvent(sendElt, 'htmx:wsAfterSend', { + message, + socketWrapper: this.publicInterface, + }); + } + } + }, + send(message: string, sendElt: Element | null) { + if (this.socket.readyState !== this.socket.OPEN) { + this.messageQueue.push({ message, sendElt }); + } else { + this.sendImmediately(message, sendElt); + } + }, + handleQueuedMessages() { + while (this.messageQueue.length > 0) { + const queuedItem = this.messageQueue[0]; + if (this.socket.readyState === this.socket.OPEN) { + this.sendImmediately(queuedItem.message, queuedItem.sendElt); + this.messageQueue.shift(); + } else { + break; + } + } + }, + init() { + if (this.socket && this.socket.readyState === this.socket.OPEN) { + // Close discarded socket + this.socket.close(); + } + + // Create a new WebSocket and event handlers + const socket = socketFunc(); + + // The event.type detail is added for interface conformance with the + // other two lifecycle events (open and close) so a single handler method + // can handle them polymorphically, if required. + api.triggerEvent(socketElt, 'htmx:wsConnecting', { event: { type: 'connecting' } }); + + this.socket = socket; + + socket.onopen = (e) => { + this.retryCount = 0; + api.triggerEvent(socketElt, 'htmx:wsOpen', { event: e, socketWrapper: this.publicInterface }); + this.handleQueuedMessages(); + }; + + socket.onclose = (e) => { + // If socket should not be connected, stop further attempts to establish connection + // If Abnormal Closure/Service Restart/Try Again Later, then set a timer to reconnect after a pause. + if (!maybeCloseWebSocketSource(socketElt) && [1006, 1012, 1013].indexOf(e.code) >= 0) { + const delay = getWebSocketReconnectDelay(this.retryCount); + setTimeout(() => { + this.retryCount += 1; + this.init(); + }, delay); + } + + // Notify client code that connection has been closed. Client code can inspect `event` field + // to determine whether closure has been valid or abnormal + api.triggerEvent(socketElt, 'htmx:wsClose', { event: e, socketWrapper: this.publicInterface }); + }; + + socket.onerror = (e) => { + api.triggerErrorEvent(socketElt, 'htmx:wsError', { error: e, socketWrapper: this }); + maybeCloseWebSocketSource(socketElt); + }; + + const events = this.events; + Object.keys(events).forEach((k) => { + events[k].forEach((e) => { + socket.addEventListener(k, e); + }); + }); + }, + close() { + this.socket.close(); + }, + publicInterface: {} as any, + }; + + wrapper.init(); + + wrapper.publicInterface = { + send: wrapper.send.bind(wrapper), + sendImmediately: wrapper.sendImmediately.bind(wrapper), + queue: wrapper.messageQueue, + }; + + return wrapper; +} + +function ensureWebSocketSend(elt: HTMLElement): void { + const legacyAttribute = api.getAttributeValue(elt, 'hx-ws'); + if (legacyAttribute && legacyAttribute !== 'send') { + return; + } + + const webSocketParent = api.getClosestMatch(elt, hasWebSocket); + if (webSocketParent) { + processWebSocketSend(webSocketParent as HTMLElement, elt); + } +} + +function hasWebSocket(node: HTMLElement): boolean { + return api.getInternalData(node).webSocket != null; +} + +function processWebSocketSend(socketElt: HTMLElement, sendElt: HTMLElement): void { + const nodeData = api.getInternalData(sendElt); + const triggerSpecs = api.getTriggerSpecs(sendElt); + triggerSpecs.forEach((ts) => { + api.addTriggerHandler(sendElt, ts, nodeData, (elt: Element, evt: Event) => { + if (maybeCloseWebSocketSource(socketElt)) { + return; + } + + const socketWrapper: WebSocketWrapper = api.getInternalData(socketElt).webSocket; + const headers = api.getHeaders(sendElt, api.getTarget(sendElt)); + const results = api.getInputValues(sendElt, 'post'); + const errors = results.errors; + const rawParameters = Object.assign({}, results.values); + const expressionVars = api.getExpressionVars(sendElt); + const allParameters = api.mergeObjects(rawParameters, expressionVars); + const filteredParameters = api.filterValues(allParameters, sendElt); + + const sendConfig = { + parameters: filteredParameters, + unfilteredParameters: allParameters, + headers, + errors, + + triggeringEvent: evt, + messageBody: undefined as string | undefined, + socketWrapper: socketWrapper.publicInterface, + }; + + if (!api.triggerEvent(elt, 'htmx:wsConfigSend', sendConfig)) { + return; + } + + if (errors && errors.length > 0) { + api.triggerEvent(elt, 'htmx:validation:halted', errors); + return; + } + + let body = sendConfig.messageBody; + if (body === undefined) { + const toSend = Object.assign({}, sendConfig.parameters); + if (sendConfig.headers) { + toSend.HEADERS = headers; + } + body = JSON.stringify(toSend); + } + + socketWrapper.send(body, elt as Element); + + if (evt && api.shouldCancel(evt, elt as Element)) { + evt.preventDefault(); + } + }); + }); +} + +function getWebSocketReconnectDelay(retryCount: number): number { + const delay = htmx.config.wsReconnectDelay; + if (typeof delay === 'function') { + return delay(retryCount); + } + if (delay === 'full-jitter') { + const exp = Math.min(retryCount, 6); + const maxDelay = 1000 * Math.pow(2, exp); + return maxDelay * Math.random(); + } + return 0; +} + +function maybeCloseWebSocketSource(elt: HTMLElement): boolean { + if (!api.bodyContains(elt)) { + api.getInternalData(elt).webSocket.close(); + return true; + } + return false; +} + +function createWebSocket(url: string): WebSocket { + const sock = new WebSocket(url, []); + sock.binaryType = (htmx.config.wsBinaryType || 'blob') as unknown as BinaryType; + return sock; +} + +function queryAttributeOnThisOrChildren(elt: HTMLElement, attributeName: string): HTMLElement[] { + const result: HTMLElement[] = []; + + // If the parent element also contains the requested attribute, then add it to the results too. + if (api.hasAttribute(elt, attributeName) || api.hasAttribute(elt, 'hx-ws')) { + result.push(elt); + } + + // Search all child nodes that match the requested attribute + elt.querySelectorAll('[' + attributeName + '], [data-' + attributeName + '], [data-hx-ws], [hx-ws]').forEach((node) => { + result.push(node as HTMLElement); + }); + + return result; +} + +function forEach(arr: T[], func: (item: T) => void): void { + if (arr) { + arr.forEach(func); + } +} + +htmx.defineExtension('ws', { + init: (apiRef: HtmxInternalApi) => { + // Store reference to internal API + api = apiRef; + + // Default function for creating new WebSocket objects + if (!htmx.createWebSocket) { + htmx.createWebSocket = createWebSocket; + } + + // Default setting for reconnect delay + if (!htmx.config.wsReconnectDelay) { + htmx.config.wsReconnectDelay = 'full-jitter'; + } + }, + + onEvent: (name: string, evt: Event) => { + const parent: Element = evt.target as Element || (evt as CustomEvent).detail.elt; + + if(!(parent instanceof HTMLElement)) { + return + } + + switch (name) { + // Try to close the socket when elements are removed + case 'htmx:beforeCleanupElement': + removeAssociatedScripts(parent); + const internalData = api.getInternalData(parent); + if (internalData.webSocket) { + internalData.webSocket.close(); + } + return; + + // Try to create websockets when elements are processed + case 'htmx:beforeProcessNode': + forEach(queryAttributeOnThisOrChildren(parent, 'ws-connect'), (child) => { + ensureWebSocket(child); + }); + forEach(queryAttributeOnThisOrChildren(parent, 'ws-send'), (child) => { + ensureWebSocketSend(child); + }); + } + }, +}); diff --git a/framework/h/attribute.go b/framework/h/attribute.go index 9651607..6821288 100644 --- a/framework/h/attribute.go +++ b/framework/h/attribute.go @@ -116,7 +116,7 @@ func HxIndicator(tag string) *AttributeR { return Attribute(hx.IndicatorAttr, tag) } -func TriggerChildren() Ren { +func TriggerChildren() *AttributeR { return HxExtension("trigger-children") } @@ -133,10 +133,22 @@ func HxTriggerClick(opts ...hx.Modifier) *AttributeR { return HxTrigger(hx.OnClick(opts...)) } -func HxExtension(value string) Ren { +func HxExtension(value string) *AttributeR { return Attribute(hx.ExtAttr, value) } +func HxExtensions(value ...string) Ren { + return Attribute(hx.ExtAttr, strings.Join(value, ",")) +} + +func JoinAttributes(sep string, attrs ...*AttributeR) *AttributeR { + values := make([]string, 0, len(attrs)) + for _, a := range attrs { + values = append(values, a.Value) + } + return Attribute(attrs[0].Name, strings.Join(values, sep)) +} + func Href(path string) Ren { return Attribute("href", path) } diff --git a/framework/h/lifecycle.go b/framework/h/lifecycle.go index 01a3f82..a3cd604 100644 --- a/framework/h/lifecycle.go +++ b/framework/h/lifecycle.go @@ -60,6 +60,16 @@ func (l *LifeCycle) HxBeforeRequest(cmd ...Command) *LifeCycle { return l } +func (l *LifeCycle) HxBeforeWsSend(cmd ...Command) *LifeCycle { + l.OnEvent(hx.BeforeWsSendEvent, cmd...) + return l +} + +func (l *LifeCycle) HxAfterWsSend(cmd ...Command) *LifeCycle { + l.OnEvent(hx.AfterWsSendEvent, cmd...) + return l +} + func HxOnLoad(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.LoadEvent, cmd...) } @@ -76,6 +86,14 @@ func OnEvent(event hx.Event, cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(event, cmd...) } +func HxBeforeWsSend(cmd ...Command) *LifeCycle { + return NewLifeCycle().HxBeforeWsSend(cmd...) +} + +func HxAfterWsSend(cmd ...Command) *LifeCycle { + return NewLifeCycle().HxAfterWsSend(cmd...) +} + func HxBeforeRequest(cmd ...Command) *LifeCycle { return NewLifeCycle().HxBeforeRequest(cmd...) } @@ -261,6 +279,11 @@ func EvalJs(js string) ComplexJsCommand { return NewComplexJsCommand(js) } +func SetValue(value string) SimpleJsCommand { + // language=JavaScript + return SimpleJsCommand{Command: fmt.Sprintf("this.value = '%s'", value)} +} + func SubmitFormOnEnter() ComplexJsCommand { // language=JavaScript return EvalJs(` diff --git a/framework/hx/htmx.go b/framework/hx/htmx.go index 6b2ce92..bedba53 100644 --- a/framework/hx/htmx.go +++ b/framework/hx/htmx.go @@ -108,6 +108,8 @@ const ( XhrLoadEndEvent Event = "htmx:xhr:loadend" XhrLoadStartEvent Event = "htmx:xhr:loadstart" XhrProgressEvent Event = "htmx:xhr:progress" + BeforeWsSendEvent Event = "htmx:wsBeforeSend" + AfterWsSendEvent Event = "htmx:wsAfterSend" // RevealedEvent Misc Events RevealedEvent Event = "revealed" diff --git a/framework/internal/datastructure/map.go b/framework/internal/datastructure/map.go index e4741d2..434c561 100644 --- a/framework/internal/datastructure/map.go +++ b/framework/internal/datastructure/map.go @@ -70,10 +70,10 @@ func (om *OrderedMap[K, V]) Values() []V { // Delete removes a key-value pair from the OrderedMap. func (om *OrderedMap[K, V]) Delete(key K) { if _, exists := om.values[key]; exists { - // Remove the key from the map + // Disconnect the key from the map delete(om.values, key) - // Remove the key from the keys slice + // Disconnect the key from the keys slice for i, k := range om.keys { if k == key { om.keys = append(om.keys[:i], om.keys[i+1:]...) diff --git a/framework/js/commands.go b/framework/js/commands.go index 24f99ff..525227d 100644 --- a/framework/js/commands.go +++ b/framework/js/commands.go @@ -22,6 +22,7 @@ var SetClassOnSibling = h.SetClassOnSibling var RemoveClassOnSibling = h.RemoveClassOnSibling var Remove = h.Remove var EvalJs = h.EvalJs +var SetValue = h.SetValue var SubmitFormOnEnter = h.SubmitFormOnEnter var InjectScript = h.InjectScript var InjectScriptIfNotExist = h.InjectScriptIfNotExist diff --git a/htmgo-site/internal/datastructures/map.go b/htmgo-site/internal/datastructures/map.go index 533ca4f..0e016c3 100644 --- a/htmgo-site/internal/datastructures/map.go +++ b/htmgo-site/internal/datastructures/map.go @@ -64,10 +64,10 @@ func (om *OrderedMap[K, V]) Values() []V { // Delete removes a key-value pair from the OrderedMap. func (om *OrderedMap[K, V]) Delete(key K) { if _, exists := om.values[key]; exists { - // Remove the key from the map + // Disconnect the key from the map delete(om.values, key) - // Remove the key from the keys slice + // Disconnect the key from the keys slice for i, k := range om.keys { if k == key { om.keys = append(om.keys[:i], om.keys[i+1:]...) From 8cdc625133cfc604becb9b833b0989c150b4ff2b Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 30 Sep 2024 16:32:12 -0500 Subject: [PATCH 02/28] some cleanup --- examples/chat/pages/index.go | 4 +- framework/assets/dist/htmgo.js | 4 +- framework/assets/js/htmxextensions/debug.ts | 3 -- framework/assets/js/htmxextensions/ws.ts | 48 ++++----------------- framework/h/attribute.go | 4 ++ 5 files changed, 15 insertions(+), 48 deletions(-) diff --git a/examples/chat/pages/index.go b/examples/chat/pages/index.go index bd131d5..59b4628 100644 --- a/examples/chat/pages/index.go +++ b/examples/chat/pages/index.go @@ -10,8 +10,7 @@ func IndexPage(ctx *h.RequestContext) *h.Page { return h.NewPage( RootPage( h.Div( - h.JoinAttributes( - ", ", + h.JoinExtensions( h.TriggerChildren(), h.HxExtension("ws"), ), @@ -36,7 +35,6 @@ func MessageInput() *h.Element { h.Class("p-4 rounded-md border border-slate-200"), h.Name("message"), h.Placeholder("Message"), - h.OnEvent("htmx:wsBeforeMessage", js.EvalJs("console.log('got message input')")), h.HxBeforeWsSend( js.SetValue(""), ), diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index b47ba73..3dd012d 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var re=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let x=consumeCSSSelector(o);x.length>0&&(s+=" "+x);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),g=l.value;if(c.lastValue===g)return;c.lastValue=g;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(m,b){s=m,l=b;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let g=getInternalData(n),x=g.lastButtonClicked;if(x){let m=getRawAttribute(x,"formaction");m!=null&&(t=m);let b=getRawAttribute(x,"formmethod");b!=null&&b.toLowerCase()!=="dialog"&&(e=b);}let C=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:C})===!1)return maybeCall(s),a;let v=n,E=getClosestAttributeValue(n,"hx-sync"),p=null,T=!1;if(E){let m=E.split(":"),b=m[0].trim();if(b==="this"?v=findThisElement(n,"hx-sync"):v=asElement(querySelectorExt(n,b)),E=(m[1]||"drop").trim(),g=getInternalData(v),E==="drop"&&g.xhr&&g.abortable!==!0)return maybeCall(s),a;if(E==="abort"){if(g.xhr)return maybeCall(s),a;T=!0;}else E==="replace"?triggerEvent(v,"htmx:abort"):E.indexOf("queue")===0&&(p=(E.split(" ")[1]||"last").trim());}if(g.xhr)if(g.abortable)triggerEvent(v,"htmx:abort");else {if(p==null){if(r){let m=getInternalData(r);m&&m.triggerSpec&&m.triggerSpec.queue&&(p=m.triggerSpec.queue);}p==null&&(p="last");}return g.queuedRequests==null&&(g.queuedRequests=[]),p==="first"&&g.queuedRequests.length===0?g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):p==="all"?g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):p==="last"&&(g.queuedRequests=[],g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let y=new XMLHttpRequest;g.xhr=y,g.abortable=T;let R=function(){g.xhr=null,g.abortable=!1,g.queuedRequests!=null&&g.queuedRequests.length>0&&g.queuedRequests.shift()();},k=getClosestAttributeValue(n,"hx-prompt");if(k){var L=prompt(k);if(L===null||!triggerEvent(n,"htmx:prompt",{prompt:L,target:c}))return maybeCall(s),R(),a}if(C&&!i&&!confirm(C))return maybeCall(s),R(),a;let D=getHeaders(n,c,L);e!=="get"&&!usesFormData(n)&&(D["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(D=mergeObjects(D,o.headers));let S=getInputValues(n,e),q=S.errors,N=S.formData;o.values&&overrideFormData(N,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),j=overrideFormData(N,_),P=filterValues(j,n);htmx.config.getCacheBusterParam&&e==="get"&&P.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,A={boosted:G,useUrlParams:F,formData:P,parameters:formDataProxy(P),unfilteredFormData:j,unfilteredParameters:formDataProxy(j),headers:D,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",A))return maybeCall(s),R(),a;if(t=A.path,e=A.verb,D=A.headers,P=formDataFromObject(A.parameters),q=A.errors,F=A.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",A),maybeCall(s),R(),a;let Y=t.split("#"),te=Y[0],z=Y[1],I=t;if(F&&(I=te,!P.keys().next().done&&(I.indexOf("?")<0?I+="?":I+="&",I+=urlEncode(P),z&&(I+="#"+z))),!verifyPath(n,I,A))return triggerErrorEvent(n,"htmx:invalidPath",A),maybeCall(l),a;if(y.open(e.toUpperCase(),I,!0),y.overrideMimeType("text/html"),y.withCredentials=A.withCredentials,y.timeout=A.timeout,!X.noHeaders){for(let m in D)if(D.hasOwnProperty(m)){let b=D[m];safelySetHeaderValue(y,m,b);}}let w={xhr:y,target:c,requestConfig:A,etc:o,boosted:G,select:d,pathInfo:{requestPath:t,finalRequestPath:I,responsePath:null,anchor:z}};if(y.onload=function(){try{let m=hierarchyForElt(n);if(w.pathInfo.responsePath=getPathFromResponse(y),u(n,w),w.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",w),triggerEvent(n,"htmx:afterOnLoad",w),!bodyContains(n)){let b=null;for(;m.length>0&&b==null;){let O=m.shift();bodyContains(O)&&(b=O);}b&&(triggerEvent(b,"htmx:afterRequest",w),triggerEvent(b,"htmx:afterOnLoad",w));}maybeCall(s),R();}catch(m){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:m},w)),m}},y.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:sendError",w),maybeCall(l),R();},y.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:sendAbort",w),maybeCall(l),R();},y.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:timeout",w),maybeCall(l),R();},!triggerEvent(n,"htmx:beforeRequest",w))return maybeCall(s),R(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(m){forEach([y,y.upload],function(b){b.addEventListener(m,function(O){triggerEvent(n,"htmx:xhr:"+m,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",w);let ne=F?null:encodeParamsForBody(y,n,P);return y.send(ne),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(L,p.swapDelay):L();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=re;function oe(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=se(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=ae(s.replace("hx-on::","htmx:"),n.detail);o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){e=="htmx:wsBeforeMessage"&&(console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t));}});var H=h.config,W,le="hx-target-";function K(e,t){return e.substring(0,t.length)===t}function ue(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(K(n,"4")||K(n,"5"))&&r.push("error");for(let o=0;o{W=e,H.responseTargetUnsetsError===void 0&&(H.responseTargetUnsetsError=!0),H.responseTargetSetsError===void 0&&(H.responseTargetSetsError=!1),H.responseTargetPrefersExisting===void 0&&(H.responseTargetPrefersExisting=!1),H.responseTargetPrefersRetargetHeader===void 0&&(H.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(H.responseTargetPrefersExisting||H.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,Q(t),!0;if(!t.detail.requestConfig)return !0;let n=ue(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(Q(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ce());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ce(){window.location.reload();}var fe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(fe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var f;function de(e){return e.trim().split(/\s+/)}function ge(e){let t=f.getAttributeValue(e,"hx-ws");if(t){let n=de(t);for(let r=0;rh.createWebSocket(t));n.addEventListener("message",r=>{if(U(e))return;let o=r.data;if(!f.triggerEvent(e,"htmx:wsBeforeMessage",{message:o,socketWrapper:n.publicInterface}))return;f.withExtensions(e,l=>{o=l.transformResponse(o,null,e);});let i=f.makeSettleInfo(e),s=f.makeFragment(o);if(s.children.length){let l=Array.from(s.children);for(let a=0;a0;){let r=this.messageQueue[0];if(this.socket.readyState===this.socket.OPEN)this.sendImmediately(r.message,r.sendElt),this.messageQueue.shift();else break}},init(){this.socket&&this.socket.readyState===this.socket.OPEN&&this.socket.close();let r=t();f.triggerEvent(e,"htmx:wsConnecting",{event:{type:"connecting"}}),this.socket=r,r.onopen=i=>{this.retryCount=0,f.triggerEvent(e,"htmx:wsOpen",{event:i,socketWrapper:this.publicInterface}),this.handleQueuedMessages();},r.onclose=i=>{if(!U(e)&&[1006,1012,1013].indexOf(i.code)>=0){let s=be(this.retryCount);setTimeout(()=>{this.retryCount+=1,this.init();},s);}f.triggerEvent(e,"htmx:wsClose",{event:i,socketWrapper:this.publicInterface});},r.onerror=i=>{f.triggerErrorEvent(e,"htmx:wsError",{error:i,socketWrapper:this}),U(e);};let o=this.events;Object.keys(o).forEach(i=>{o[i].forEach(s=>{r.addEventListener(i,s);});});},close(){this.socket.close();},publicInterface:{}};return n.init(),n.publicInterface={send:n.send.bind(n),sendImmediately:n.sendImmediately.bind(n),queue:n.messageQueue},n}function Ee(e){let t=f.getAttributeValue(e,"hx-ws");if(t&&t!=="send")return;let n=f.getClosestMatch(e,pe);n&&ye(n,e);}function pe(e){return f.getInternalData(e).webSocket!=null}function ye(e,t){let n=f.getInternalData(t);f.getTriggerSpecs(t).forEach(o=>{f.addTriggerHandler(t,o,n,(i,s)=>{if(U(e))return;let l=f.getInternalData(e).webSocket,a=f.getHeaders(t,f.getTarget(t)),u=f.getInputValues(t,"post"),d=u.errors,c=Object.assign({},u.values),g=f.getExpressionVars(t),x=f.mergeObjects(c,g),v={parameters:f.filterValues(x,t),unfilteredParameters:x,headers:a,errors:d,triggeringEvent:s,messageBody:void 0,socketWrapper:l.publicInterface};if(!f.triggerEvent(i,"htmx:wsConfigSend",v))return;if(d&&d.length>0){f.triggerEvent(i,"htmx:validation:halted",d);return}let E=v.messageBody;if(E===void 0){let p=Object.assign({},v.parameters);v.headers&&(p.HEADERS=a),E=JSON.stringify(p);}l.send(E,i),s&&f.shouldCancel(s,i)&&s.preventDefault();});});}function be(e){let t=h.config.wsReconnectDelay;if(typeof t=="function")return t(e);if(t==="full-jitter"){let n=Math.min(e,6);return 1e3*Math.pow(2,n)*Math.random()}return 0}function U(e){return f.bodyContains(e)?!1:(f.getInternalData(e).webSocket.close(),!0)}function xe(e){let t=new WebSocket(e,[]);return t.binaryType=h.config.wsBinaryType||"blob",t}function Z(e,t){let n=[];return (f.hasAttribute(e,t)||f.hasAttribute(e,"hx-ws"))&&n.push(e),e.querySelectorAll("["+t+"], [data-"+t+"], [data-hx-ws], [hx-ws]").forEach(r=>{n.push(r);}),n}function ee(e,t){e&&e.forEach(t);}h.defineExtension("ws",{init:e=>{f=e,h.createWebSocket||(h.createWebSocket=xe),h.config.wsReconnectDelay||(h.config.wsReconnectDelay="full-jitter");},onEvent:(e,t)=>{let n=t.target||t.detail.elt;if(n instanceof HTMLElement)switch(e){case"htmx:beforeCleanupElement":J(n);let r=f.getInternalData(n);r.webSocket&&r.webSocket.close();return;case"htmx:beforeProcessNode":ee(Z(n,"ws-connect"),o=>{he(o);}),ee(Z(n,"ws-send"),o=>{Ee(o);});}}});function ve(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}ve((e,t)=>{we(t);});function we(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var re=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let x=consumeCSSSelector(o);x.length>0&&(s+=" "+x);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),g=l.value;if(c.lastValue===g)return;c.lastValue=g;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(h,b){s=h,l=b;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let g=getInternalData(n),x=g.lastButtonClicked;if(x){let h=getRawAttribute(x,"formaction");h!=null&&(t=h);let b=getRawAttribute(x,"formmethod");b!=null&&b.toLowerCase()!=="dialog"&&(e=b);}let C=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:C})===!1)return maybeCall(s),a;let v=n,E=getClosestAttributeValue(n,"hx-sync"),p=null,T=!1;if(E){let h=E.split(":"),b=h[0].trim();if(b==="this"?v=findThisElement(n,"hx-sync"):v=asElement(querySelectorExt(n,b)),E=(h[1]||"drop").trim(),g=getInternalData(v),E==="drop"&&g.xhr&&g.abortable!==!0)return maybeCall(s),a;if(E==="abort"){if(g.xhr)return maybeCall(s),a;T=!0;}else E==="replace"?triggerEvent(v,"htmx:abort"):E.indexOf("queue")===0&&(p=(E.split(" ")[1]||"last").trim());}if(g.xhr)if(g.abortable)triggerEvent(v,"htmx:abort");else {if(p==null){if(r){let h=getInternalData(r);h&&h.triggerSpec&&h.triggerSpec.queue&&(p=h.triggerSpec.queue);}p==null&&(p="last");}return g.queuedRequests==null&&(g.queuedRequests=[]),p==="first"&&g.queuedRequests.length===0?g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):p==="all"?g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):p==="last"&&(g.queuedRequests=[],g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let y=new XMLHttpRequest;g.xhr=y,g.abortable=T;let R=function(){g.xhr=null,g.abortable=!1,g.queuedRequests!=null&&g.queuedRequests.length>0&&g.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var L=prompt(N);if(L===null||!triggerEvent(n,"htmx:prompt",{prompt:L,target:c}))return maybeCall(s),R(),a}if(C&&!i&&!confirm(C))return maybeCall(s),R(),a;let D=getHeaders(n,c,L);e!=="get"&&!usesFormData(n)&&(D["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(D=mergeObjects(D,o.headers));let S=getInputValues(n,e),q=S.errors,k=S.formData;o.values&&overrideFormData(k,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),j=overrideFormData(k,_),P=filterValues(j,n);htmx.config.getCacheBusterParam&&e==="get"&&P.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,A={boosted:G,useUrlParams:F,formData:P,parameters:formDataProxy(P),unfilteredFormData:j,unfilteredParameters:formDataProxy(j),headers:D,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",A))return maybeCall(s),R(),a;if(t=A.path,e=A.verb,D=A.headers,P=formDataFromObject(A.parameters),q=A.errors,F=A.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",A),maybeCall(s),R(),a;let Y=t.split("#"),te=Y[0],z=Y[1],I=t;if(F&&(I=te,!P.keys().next().done&&(I.indexOf("?")<0?I+="?":I+="&",I+=urlEncode(P),z&&(I+="#"+z))),!verifyPath(n,I,A))return triggerErrorEvent(n,"htmx:invalidPath",A),maybeCall(l),a;if(y.open(e.toUpperCase(),I,!0),y.overrideMimeType("text/html"),y.withCredentials=A.withCredentials,y.timeout=A.timeout,!X.noHeaders){for(let h in D)if(D.hasOwnProperty(h)){let b=D[h];safelySetHeaderValue(y,h,b);}}let w={xhr:y,target:c,requestConfig:A,etc:o,boosted:G,select:d,pathInfo:{requestPath:t,finalRequestPath:I,responsePath:null,anchor:z}};if(y.onload=function(){try{let h=hierarchyForElt(n);if(w.pathInfo.responsePath=getPathFromResponse(y),u(n,w),w.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",w),triggerEvent(n,"htmx:afterOnLoad",w),!bodyContains(n)){let b=null;for(;h.length>0&&b==null;){let O=h.shift();bodyContains(O)&&(b=O);}b&&(triggerEvent(b,"htmx:afterRequest",w),triggerEvent(b,"htmx:afterOnLoad",w));}maybeCall(s),R();}catch(h){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:h},w)),h}},y.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:sendError",w),maybeCall(l),R();},y.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:sendAbort",w),maybeCall(l),R();},y.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:timeout",w),maybeCall(l),R();},!triggerEvent(n,"htmx:beforeRequest",w))return maybeCall(s),R(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(h){forEach([y,y.upload],function(b){b.addEventListener(h,function(O){triggerEvent(n,"htmx:xhr:"+h,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",w);let ne=F?null:encodeParamsForBody(y,n,P);return y.send(ne),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(L,p.swapDelay):L();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),m=re;function oe(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=se(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=ae(s.replace("hx-on::","htmx:"),n.detail);o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}m.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});m.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var H=m.config,W,le="hx-target-";function K(e,t){return e.substring(0,t.length)===t}function ue(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(K(n,"4")||K(n,"5"))&&r.push("error");for(let o=0;o{W=e,H.responseTargetUnsetsError===void 0&&(H.responseTargetUnsetsError=!0),H.responseTargetSetsError===void 0&&(H.responseTargetSetsError=!1),H.responseTargetPrefersExisting===void 0&&(H.responseTargetPrefersExisting=!1),H.responseTargetPrefersRetargetHeader===void 0&&(H.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(H.responseTargetPrefersExisting||H.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,Q(t),!0;if(!t.detail.requestConfig)return !0;let n=ue(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(Q(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});m.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&m.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{m.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";m.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(m.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ce());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ce(){window.location.reload();}var fe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;m.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(fe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var f;function de(e){return e.trim().split(/\s+/)}function ge(e){let t=f.getAttributeValue(e,"hx-ws");if(t){let n=de(t);for(let r=0;rxe(t));n.addEventListener("message",r=>{if(U(e))return;let o=r.data;if(!f.triggerEvent(e,"htmx:wsBeforeMessage",{message:o,socketWrapper:n.publicInterface}))return;f.withExtensions(e,l=>{o=l.transformResponse(o,null,e);});let i=f.makeSettleInfo(e),s=f.makeFragment(o);if(s.children.length){let l=Array.from(s.children);for(let a=0;a0;){let r=this.messageQueue[0];if(this.socket.readyState===this.socket.OPEN)this.sendImmediately(r.message,r.sendElt),this.messageQueue.shift();else break}},init(){this.socket&&this.socket.readyState===this.socket.OPEN&&this.socket.close();let r=t();f.triggerEvent(e,"htmx:wsConnecting",{event:{type:"connecting"}}),this.socket=r,r.onopen=i=>{this.retryCount=0,f.triggerEvent(e,"htmx:wsOpen",{event:i,socketWrapper:this.publicInterface}),this.handleQueuedMessages();},r.onclose=i=>{if(!U(e)&&[1006,1012,1013].indexOf(i.code)>=0){let s=be(this.retryCount);setTimeout(()=>{this.retryCount+=1,this.init();},s);}f.triggerEvent(e,"htmx:wsClose",{event:i,socketWrapper:this.publicInterface});},r.onerror=i=>{f.triggerErrorEvent(e,"htmx:wsError",{error:i,socketWrapper:this}),U(e);};let o=this.events;Object.keys(o).forEach(i=>{o[i].forEach(s=>{r.addEventListener(i,s);});});},close(){this.socket.close();},publicInterface:{}};return n.init(),n.publicInterface={send:n.send.bind(n),sendImmediately:n.sendImmediately.bind(n),queue:n.messageQueue},n}function Ee(e){let t=f.getAttributeValue(e,"hx-ws");if(t&&t!=="send")return;let n=f.getClosestMatch(e,r=>pe(r));n&&ye(n,e);}function pe(e){return f.getInternalData(e).webSocket!=null}function ye(e,t){let n=f.getInternalData(t);f.getTriggerSpecs(t).forEach(o=>{f.addTriggerHandler(t,o,n,(i,s)=>{if(U(e))return;let l=f.getInternalData(e).webSocket,a=f.getHeaders(t,f.getTarget(t)),u=f.getInputValues(t,"post"),d=u.errors,c=Object.assign({},u.values),g=f.getExpressionVars(t),x=f.mergeObjects(c,g),v={parameters:f.filterValues(x,t),unfilteredParameters:x,headers:a,errors:d,triggeringEvent:s,messageBody:void 0,socketWrapper:l.publicInterface};if(!f.triggerEvent(i,"htmx:wsConfigSend",v))return;if(d&&d.length>0){f.triggerEvent(i,"htmx:validation:halted",d);return}let E=v.messageBody;if(E===void 0){let p=Object.assign({},v.parameters);v.headers&&(p.HEADERS=a),E=JSON.stringify(p);}l.send(E,i),s&&f.shouldCancel(s,i)&&s.preventDefault();});});}function be(e){let t=Math.min(e,6);return 1e3*Math.pow(2,t)*Math.random()}function U(e){return f.bodyContains(e)?!1:(f.getInternalData(e).webSocket.close(),!0)}function xe(e){let t=new WebSocket(e,[]);return t.binaryType=m.config.wsBinaryType||"blob",t}function Z(e,t){let n=[];return (f.hasAttribute(e,t)||f.hasAttribute(e,"hx-ws"))&&n.push(e),e.querySelectorAll("["+t+"], [data-"+t+"], [data-hx-ws], [hx-ws]").forEach(r=>{n.push(r);}),n}function ee(e,t){e&&e.forEach(t);}m.defineExtension("ws",{init:e=>{f=e;},onEvent:(e,t)=>{let n=t.target||t.detail.elt;if(n instanceof HTMLElement)switch(e){case"htmx:beforeCleanupElement":J(n);let r=f.getInternalData(n);r.webSocket&&r.webSocket.close();return;case"htmx:beforeProcessNode":ee(Z(n,"ws-connect"),o=>{he(o);}),ee(Z(n,"ws-send"),o=>{Ee(o);});}}});function ve(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}ve((e,t)=>{we(t);});function we(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))m.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),m.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){m.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&m.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy93cy50cyIsIi4uL2pzL2h0bWdvLnRzIl0sIm5hbWVzIjpbImh0bXgiLCJlbHQiLCJ0eXBlIiwidmVyYiIsInRhZyIsImdsb2JhbCIsInN0ciIsImludGVydmFsIiwibmFtZSIsInF1YWxpZmllZE5hbWUiLCJwYXJlbnQiLCJjb25kaXRpb24iLCJpbml0aWFsRWxlbWVudCIsImFuY2VzdG9yIiwiYXR0cmlidXRlTmFtZSIsImF0dHJpYnV0ZVZhbHVlIiwiZGlzaW5oZXJpdCIsImluaGVyaXQiLCJjbG9zZXN0QXR0ciIsImUiLCJzZWxlY3RvciIsIm1hdGNoZXNGdW5jdGlvbiIsIm1hdGNoIiwicmVzcCIsImZyYWdtZW50Iiwic2NyaXB0IiwibmV3U2NyaXB0IiwiYXR0ciIsInJlc3BvbnNlIiwicmVzcG9uc2VXaXRoTm9IZWFkIiwic3RhcnRUYWciLCJkb2MiLCJ0aXRsZUVsZW1lbnQiLCJmdW5jIiwibyIsImRhdGFQcm9wIiwiZGF0YSIsImFyciIsInJldHVybkFyciIsImkiLCJlbCIsInJlY3QiLCJlbGVtVG9wIiwiZWxlbUJvdHRvbSIsInJvb3ROb2RlIiwidHJpZ2dlciIsIm9iajEiLCJvYmoyIiwia2V5IiwialN0cmluZyIsImVycm9yIiwidGVzdCIsInBhdGgiLCJ1cmwiLCJjYWxsYmFjayIsImV2dCIsImV2ZW50IiwiZWx0T3JTZWxlY3RvciIsImRlbGF5IiwidmFsdWUiLCJjbGF6eiIsIm5vZGUiLCJjaGlsZCIsInByZWZpeCIsInN1ZmZpeCIsInRyaW1tZWRTZWxlY3RvciIsInN0YXJ0IiwicmVzdWx0cyIsImNvbnRleHQiLCJhcmcxIiwiYXJnMiIsImFyZzMiLCJldmVudEFyZ3MiLCJhdHRyTmFtZSIsImF0dHJUYXJnZXQiLCJyZXN1bHQiLCJhdHRyaWJ1dGUiLCJ0YXJnZXRTdHIiLCJhdHRyaWJ1dGVzVG9TZXR0bGUiLCJtZXJnZVRvIiwibWVyZ2VGcm9tIiwic3dhcFN0eWxlIiwidGFyZ2V0IiwiZXh0ZW5zaW9ucyIsImV4dGVuc2lvbiIsIm9vYlZhbHVlIiwib29iRWxlbWVudCIsInNldHRsZUluZm8iLCJ0YXJnZXRzIiwib29iRWxlbWVudENsb25lIiwiYmVmb3JlU3dhcERldGFpbHMiLCJwcmVzZXJ2ZWRFbHQiLCJpZCIsIm9sZEVsdCIsInBhcmVudE5vZGUiLCJuZXdOb2RlIiwibm9ybWFsaXplZElkIiwibm9ybWFsaXplZFRhZyIsInBhcmVudEVsdCIsIm9sZE5vZGUiLCJuZXdBdHRyaWJ1dGVzIiwiYXV0b2ZvY3VzIiwiYXV0b0ZvY3VzZWRFbHQiLCJpbnNlcnRCZWZvcmUiLCJzdHJpbmciLCJoYXNoIiwiY2hhciIsImludGVybmFsRGF0YSIsImhhbmRsZXJJbmZvIiwiZWxlbWVudCIsImluZm8iLCJuZXdFbHQiLCJlbHRCZWZvcmVOZXdDb250ZW50IiwiZmlyc3RDaGlsZCIsImV4dCIsIm5ld0VsZW1lbnRzIiwiaiIsIm9vYkVsdHMiLCJjb250ZW50Iiwic3dhcFNwZWMiLCJzd2FwT3B0aW9ucyIsImFjdGl2ZUVsdCIsInNlbGVjdGlvbkluZm8iLCJvb2JTZWxlY3RWYWx1ZXMiLCJvb2JTZWxlY3RWYWx1ZSIsInRlbXBsYXRlIiwibmV3RnJhZ21lbnQiLCJuZXdBY3RpdmVFbHQiLCJmb2N1c09wdGlvbnMiLCJkb1NldHRsZSIsInRhc2siLCJhbmNob3JUYXJnZXQiLCJ4aHIiLCJoZWFkZXIiLCJ0cmlnZ2VyQm9keSIsInRyaWdnZXJzIiwiZXZlbnROYW1lIiwiZGV0YWlsIiwiZXZlbnROYW1lcyIsInRva2VucyIsInBvc2l0aW9uIiwic3RhcnRQb3NpdGlvbiIsInN0YXJ0Q2hhciIsInN5bWJvbCIsInRva2VuIiwibGFzdCIsInBhcmFtTmFtZSIsImJyYWNrZXRDb3VudCIsImNvbmRpdGlvbmFsU291cmNlIiwiY29uZGl0aW9uRnVuY3Rpb24iLCJleHBsaWNpdFRyaWdnZXIiLCJjYWNoZSIsInRyaWdnZXJTcGVjcyIsImluaXRpYWxMZW5ndGgiLCJldmVyeSIsImV2ZW50RmlsdGVyIiwidHJpZ2dlclNwZWMiLCJmcm9tX2FyZyIsImhhbmRsZXIiLCJzcGVjIiwibm9kZURhdGEiLCJyYXdBdHRyaWJ1dGUiLCJzb3VyY2UiLCJleHBsaWNpdENhbmNlbCIsImVsZW1lbnREYXRhIiwiZWx0c1RvTGlzdGVuT24iLCJlbHRUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbkRhdGEiLCJldmVudExpc3RlbmVyIiwiZXZlbnREYXRhIiwibG9hZCIsImV4cGxpY2l0QWN0aW9uIiwib2JzZXJ2ZXJPcHRpb25zIiwiZW50cmllcyIsImF0dHJpYnV0ZXMiLCJlbGVtZW50cyIsIml0ZXIiLCJib29zdGVkU2VsZWN0b3IiLCJleHRlbnNpb25TZWxlY3RvcnMiLCJzZWxlY3RvcnMiLCJzIiwiZm9ybSIsImNvZGUiLCJsaXN0ZW5lciIsImFmdGVyT25Qb3NpdGlvbiIsIm5leHRDaGFyIiwidG9EbyIsIm1zZyIsImV2ZW50UmVzdWx0Iiwia2ViYWJOYW1lIiwia2ViYWJlZEV2ZW50Iiwicm9vdEVsdCIsImlubmVySFRNTCIsInRpdGxlIiwic2Nyb2xsIiwiaGlzdG9yeUNhY2hlIiwibmV3SGlzdG9yeUl0ZW0iLCJjbGFzc05hbWUiLCJjbG9uZSIsImRpc2FibGVIaXN0b3J5Q2FjaGUiLCJ0YXNrcyIsInJlcXVlc3QiLCJkZXRhaWxzIiwiaGlzdG9yeUVsZW1lbnQiLCJjYWNoZWQiLCJpbmRpY2F0b3JzIiwiaWMiLCJkaXNhYmxlZEVsdHMiLCJkaXNhYmxlZEVsZW1lbnQiLCJkaXNhYmxlZCIsInByb2Nlc3NlZCIsImZvcm1EYXRhIiwidiIsInZhbHVlcyIsImVycm9ycyIsInZhbGlkYXRlIiwiaW5wdXQiLCJyZWNlaXZlciIsImRvbm9yIiwicHJpb3JpdHlGb3JtRGF0YSIsImJ1dHRvbiIsImluY2x1ZGVzIiwiZGVzY2VuZGFudCIsInJldHVyblN0ciIsInJlYWxWYWx1ZSIsInByb21wdCIsImhlYWRlcnMiLCJpbnB1dFZhbHVlcyIsInBhcmFtc1ZhbHVlIiwibmV3VmFsdWVzIiwic3dhcEluZm9PdmVycmlkZSIsInN3YXBJbmZvIiwic3BsaXQiLCJzcGxpdFNwZWMiLCJzY3JvbGxWYWwiLCJzZWxlY3RvclZhbCIsInNob3dWYWwiLCJmb2N1c1Njcm9sbFZhbCIsImZpbHRlcmVkUGFyYW1ldGVycyIsImVuY29kZWRQYXJhbWV0ZXJzIiwiZmlyc3QiLCJldmFsQXNEZWZhdWx0IiwiZXZhbHVhdGVWYWx1ZSIsInZhcnNWYWx1ZXMiLCJ0b0V2YWwiLCJkZWZhdWx0VmFsIiwiZXhwcmVzc2lvblZhcnMiLCJoZWFkZXJWYWx1ZSIsInJlZ2V4cCIsInJlcXVlc3RDb25maWciLCJzYW1lSG9zdCIsIm9iaiIsImFycmF5IiwiaW5kZXgiLCJwcm9wIiwiZXRjIiwiY29uZmlybWVkIiwicmVzb2x2ZSIsInJlamVjdCIsInByb21pc2UiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJyZXNwb25zZUhhbmRsZXIiLCJzZWxlY3QiLCJlbHREYXRhIiwic3VibWl0dGVyIiwiYnV0dG9uUGF0aCIsImJ1dHRvblZlcmIiLCJjb25maXJtUXVlc3Rpb24iLCJza2lwQ29uZmlybWF0aW9uIiwic3luY0VsdCIsInN5bmNTdHJhdGVneSIsInF1ZXVlU3RyYXRlZ3kiLCJhYm9ydGFibGUiLCJzeW5jU3RyaW5ncyIsImVuZFJlcXVlc3RMb2NrIiwicHJvbXB0UXVlc3Rpb24iLCJwcm9tcHRSZXNwb25zZSIsInJhd0Zvcm1EYXRhIiwiYWxsRm9ybURhdGEiLCJmaWx0ZXJlZEZvcm1EYXRhIiwicmVxdWVzdEF0dHJWYWx1ZXMiLCJlbHRJc0Jvb3N0ZWQiLCJ1c2VVcmxQYXJhbXMiLCJzcGxpdFBhdGgiLCJwYXRoTm9BbmNob3IiLCJhbmNob3IiLCJmaW5hbFBhdGgiLCJyZXNwb25zZUluZm8iLCJoaWVyYXJjaHkiLCJkaXNhYmxlRWx0cyIsInNlY29uZGFyeVRyaWdnZXJFbHQiLCJwYXJlbnRFbHRJbkhpZXJhcmNoeSIsInBhcmFtcyIsInBhdGhGcm9tSGVhZGVycyIsInR5cGVGcm9tSGVhZGVycyIsInJlcXVlc3RQYXRoIiwicmVzcG9uc2VQYXRoIiwicHVzaFVybCIsInJlcGxhY2VVcmwiLCJlbGVtZW50SXNCb29zdGVkIiwic2F2ZVR5cGUiLCJyZXNwb25zZUhhbmRsaW5nQ29uZmlnIiwic3RhdHVzIiwicmVnRXhwIiwicmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQiLCJ0aXRsZUVsdCIsInJlc3BvbnNlSW5mb1NlbGVjdCIsInJlZGlyZWN0UGF0aCIsInJlZGlyZWN0U3dhcFNwZWMiLCJzaG91bGRSZWZyZXNoIiwiaGlzdG9yeVVwZGF0ZSIsInJlc3BvbnNlSGFuZGxpbmciLCJzaG91bGRTd2FwIiwiaXNFcnJvciIsImlnbm9yZVRpdGxlIiwic2VsZWN0T3ZlcnJpZGUiLCJzd2FwT3ZlcnJpZGUiLCJzZXJ2ZXJSZXNwb25zZSIsInNldHRsZVJlc29sdmUiLCJzZXR0bGVSZWplY3QiLCJzZWxlY3RPT0IiLCJkb1N3YXAiLCJmaW5hbEVsdCIsInNob3VsZFRyYW5zaXRpb24iLCJzZXR0bGVQcm9taXNlIiwiaW5uZXJEb1N3YXAiLCJhcGkiLCJ0ZXh0IiwicGFyYW1ldGVycyIsImV4dGVuc2lvbnNUb1JldHVybiIsImV4dGVuc2lvbnNUb0lnbm9yZSIsImV4dGVuc2lvbnNGb3JFbGVtZW50IiwiZXh0ZW5zaW9uTmFtZSIsImZuIiwibm9uY2VBdHRyaWJ1dGUiLCJtZXRhQ29uZmlnIiwiYm9keSIsInJlc3RvcmVkRWx0cyIsIm9yaWdpbmFsUG9wc3RhdGUiLCJodG14X2VzbV9kZWZhdWx0IiwiZGVwZW5kc09uIiwicGF0aFNwZWMiLCJkZXBlbmRlbmN5UGF0aCIsInVybFBhdGgiLCJkZXBlbmRlbmN5RWxlbWVudCIsInBhdGhFbGVtZW50IiwicmVmcmVzaFBhdGgiLCJlbHRzV2l0aERlcHMiLCJjb25maWciLCJrZWJhYkV2ZW50TmFtZSIsIm1ha2VFdmVudCIsInRyaWdnZXJDaGlsZHJlbiIsInRyaWdnZXJlZCIsIm5ld0V2ZW50IiwiYXR0clByZWZpeCIsInN0YXJ0c1dpdGgiLCJnZXRSZXNwQ29kZVRhcmdldCIsInJlc3BDb2RlTnVtYmVyIiwicmVzcENvZGUiLCJhdHRyUG9zc2liaWxpdGllcyIsImF0dHJWYWx1ZSIsImhhbmRsZUVycm9yRmxhZyIsImFwaVJlZiIsImxhc3RWZXJzaW9uIiwiZW5hYmxlZCIsImV2ZW50U291cmNlIiwibWVzc2FnZSIsInJlbG9hZCIsImV2YWxGdW5jUmVnZXgiLCJyZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyIsIm1hdGNoZXMiLCJlbGUiLCJzcGxpdE9uV2hpdGVzcGFjZSIsImdldExlZ2FjeVdlYnNvY2tldFVSTCIsImxlZ2FjeVNTRVZhbHVlIiwiZW5zdXJlV2ViU29ja2V0Iiwic29ja2V0RWx0Iiwid3NzU291cmNlIiwibGVnYWN5U291cmNlIiwiYmFzZV9wYXJ0Iiwic29ja2V0V3JhcHBlciIsImNyZWF0ZVdlYnNvY2tldFdyYXBwZXIiLCJtYXliZUNsb3NlV2ViU29ja2V0U291cmNlIiwiY2hpbGRyZW4iLCJzb2NrZXRGdW5jIiwid3JhcHBlciIsInNlbmRFbHQiLCJxdWV1ZWRJdGVtIiwic29ja2V0IiwiZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkiLCJldmVudHMiLCJrIiwiZW5zdXJlV2ViU29ja2V0U2VuZCIsImxlZ2FjeUF0dHJpYnV0ZSIsIndlYlNvY2tldFBhcmVudCIsImhhc1dlYlNvY2tldCIsInByb2Nlc3NXZWJTb2NrZXRTZW5kIiwidHMiLCJyYXdQYXJhbWV0ZXJzIiwiYWxsUGFyYW1ldGVycyIsInNlbmRDb25maWciLCJ0b1NlbmQiLCJyZXRyeUNvdW50IiwiZXhwIiwiY3JlYXRlV2ViU29ja2V0Iiwic29jayIsInF1ZXJ5QXR0cmlidXRlT25UaGlzT3JDaGlsZHJlbiIsImZvckVhY2giLCJ3YXRjaFVybCIsImxhc3RVcmwiLCJfIiwibmV3VXJsIiwib25VcmxDaGFuZ2UiLCJoYXNNYXRjaCIsImRlZmF1bHRLZXkiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLEVBQUFBLENBQVEsVUFBVyxDQUlyQixJQUFNLElBQU8sQ0FBQSxDQUlYLE9BQVEsSUFFUixDQUFBLE9BQUEsQ0FBUyxLQUVULEVBQUksQ0FBQSxJQUFBLENBRUosSUFBSyxJQUVMLENBQUEsT0FBQSxDQUFTLEtBRVQsSUFBTSxDQUFBLElBQUEsQ0FHTixJQUFNLENBQUEsSUFBQSxDQUVOLE9BQVMsQ0FBQSxJQUFBLENBRVQsUUFBUyxJQVVULENBQUEsTUFBQSxDQUFRLFNBQVNDLENBQUtDLENBQUFBLENBQUFBLENBQU0sQ0FFMUIsT0FEb0IsY0FBQSxDQUFlRCxDQUFLQyxDQUFBQSxDQUFBQSxFQUFRLE1BQU0sQ0FBQSxDQUNuQyxNQUNyQixDQUdBLENBQUEsTUFBQSxDQUFRLEtBRVIsUUFBVSxDQUFBLElBQUEsQ0FFVixZQUFhLElBRWIsQ0FBQSxXQUFBLENBQWEsSUFFYixDQUFBLFNBQUEsQ0FBVyxJQUVYLENBQUEsSUFBQSxDQUFNLEtBR04sZUFBaUIsQ0FBQSxJQUFBLENBRWpCLGdCQUFpQixJQUdqQixDQUFBLE1BQUEsQ0FBUSxLQUVSLE9BQVMsQ0FBQSxJQUFBLENBT1QsTUFBUSxDQUFBLElBQUEsQ0FRUixNQUFRLENBQUEsQ0FNTixlQUFnQixDQU1oQixDQUFBLENBQUEsZ0JBQUEsQ0FBa0IsR0FLbEIsb0JBQXNCLENBQUEsQ0FBQSxDQUFBLENBTXRCLGlCQUFrQixXQU1sQixDQUFBLGdCQUFBLENBQWtCLENBTWxCLENBQUEsa0JBQUEsQ0FBb0IsRUFNcEIsQ0FBQSxzQkFBQSxDQUF3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Q0FDcEMsR0FBSWhDLENBQUssQ0FBQSxVQUFBLENBQVcsc0JBQXNCLENBQUcsQ0FBQSxDQUMzQyxJQUFJYyxDQUFBQSxDQUFRZCxDQUFLLENBQUEsT0FBQSxDQUFRLHVCQUF3QixFQUFFLENBQUEsQ0FFbkQsR0FEWTZDLENBQUksQ0FBQSxZQUFBLENBQWEsSUFBSS9CLENBQUssQ0FBQSxDQUMzQixDQUNUOFQsQ0FBQUEsQ0FBSyxJQUFLNVMsQ0FBQUEsQ0FBQUEsQ0FBSUEsRUFBRyxZQUFhaEMsQ0FBQUEsQ0FBSSxHQUFLLEVBQUksQ0FBQSxDQUN6QyxVQUFXLFdBQ1gsQ0FBQSxTQUFBLENBQVcsQ0FDWCxDQUFBLFdBQUEsQ0FBYSxDQUNmLENBQUMsRUFDRHNaLENBQVcsQ0FBQSxDQUFBLENBQUEsQ0FDWCxLQUNGLENBQ0YsQ0FFRixHQUFJLENBQUNBLENBQUFBLENBQVUsQ0FDYixJQUFJQyxDQUFhdlgsQ0FBQUEsQ0FBQUEsQ0FBRyxhQUFhLHFCQUFxQixDQUFBLENBQ2xEdVgsR0FDRjNFLENBQUssQ0FBQSxJQUFBLENBQ0g1UyxFQUNBQSxDQUFHLENBQUEsWUFBQSxDQUFhLHNCQUF5QnVYLENBQUFBLENBQVUsQ0FBSyxFQUFBLEVBQUEsQ0FDeEQsQ0FBRSxTQUFXLENBQUEsV0FBQSxDQUFhLFVBQVcsQ0FBRyxDQUFBLFdBQUEsQ0FBYSxDQUFFLENBQ3pELEVBRUosQ0FDRixDQUFDLEVBQ0giLCJmaWxlIjoiaHRtZ28uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaHRteCA9IChmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnXG5cbiAgLy8gUHVibGljIEFQSVxuICBjb25zdCBodG14ID0ge1xuICAgIC8vIFRzYyBtYWRuZXNzIGhlcmUsIGFzc2lnbmluZyB0aGUgZnVuY3Rpb25zIGRpcmVjdGx5IHJlc3VsdHMgaW4gYW4gaW52YWxpZCBUeXBlU2NyaXB0IG91dHB1dCwgYnV0IHJlYXNzaWduaW5nIGlzIGZpbmVcbiAgICAvKiBFdmVudCBwcm9jZXNzaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygb25Mb2FkSGVscGVyfSAqL1xuICAgIG9uTG9hZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwcm9jZXNzTm9kZX0gKi9cbiAgICBwcm9jZXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZEV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9mZjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0cmlnZ2VyRXZlbnR9ICovXG4gICAgdHJpZ2dlcjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhamF4SGVscGVyfSAqL1xuICAgIGFqYXg6IG51bGwsXG4gICAgLyogRE9NIHF1ZXJ5aW5nIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kfSAqL1xuICAgIGZpbmQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZEFsbH0gKi9cbiAgICBmaW5kQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGNsb3Nlc3R9ICovXG4gICAgY2xvc2VzdDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbnB1dCB2YWx1ZXMgdGhhdCB3b3VsZCByZXNvbHZlIGZvciBhIGdpdmVuIGVsZW1lbnQgdmlhIHRoZSBodG14IHZhbHVlIHJlc29sdXRpb24gbWVjaGFuaXNtXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN2YWx1ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0IHRoZSBlbGVtZW50IHRvIHJlc29sdmUgdmFsdWVzIG9uXG4gICAgICogQHBhcmFtIHtIdHRwVmVyYn0gdHlwZSB0aGUgcmVxdWVzdCB0eXBlIChlLmcuICoqZ2V0Kiogb3IgKipwb3N0KiopIG5vbi1HRVQncyB3aWxsIGluY2x1ZGUgdGhlIGVuY2xvc2luZyBmb3JtIG9mIHRoZSBlbGVtZW50LiBEZWZhdWx0cyB0byAqKnBvc3QqKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgdmFsdWVzOiBmdW5jdGlvbihlbHQsIHR5cGUpIHtcbiAgICAgIGNvbnN0IGlucHV0VmFsdWVzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB0eXBlIHx8ICdwb3N0JylcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlcy52YWx1ZXNcbiAgICB9LFxuICAgIC8qIERPTSBtYW5pcHVsYXRpb24gaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZENsYXNzVG9FbGVtZW50fSAqL1xuICAgIGFkZENsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdG9nZ2xlQ2xhc3NPbkVsZW1lbnR9ICovXG4gICAgdG9nZ2xlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdGFrZUNsYXNzRm9yRWxlbWVudH0gKi9cbiAgICB0YWtlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygc3dhcH0gKi9cbiAgICBzd2FwOiBudWxsLFxuICAgIC8qIEV4dGVuc2lvbiBlbnRyeXBvaW50cyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGRlZmluZUV4dGVuc2lvbn0gKi9cbiAgICBkZWZpbmVFeHRlbnNpb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXh0ZW5zaW9ufSAqL1xuICAgIHJlbW92ZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dBbGx9ICovXG4gICAgbG9nQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ05vbmV9ICovXG4gICAgbG9nTm9uZTogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKipcbiAgICAgKiBUaGUgbG9nZ2VyIGh0bXggdXNlcyB0byBsb2cgd2l0aFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nZ2VyXG4gICAgICovXG4gICAgbG9nZ2VyOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHkgaG9sZGluZyB0aGUgY29uZmlndXJhdGlvbiBodG14IHVzZXMgYXQgcnVudGltZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB1c2luZyBhIFttZXRhIHRhZ10oaHR0cHM6Ly9odG14Lm9yZy9kb2NzLyNjb25maWcpIGlzIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHRoZXNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjb25maWdcbiAgICAgKi9cbiAgICBjb25maWc6IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byB1c2UgaGlzdG9yeS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUVuYWJsZWQ6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8ga2VlcCBpbiAqKmxvY2FsU3RvcmFnZSoqIGZvciBoaXN0b3J5IHN1cHBvcnQuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlDYWNoZVNpemU6IDEwLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICByZWZyZXNoT25IaXN0b3J5TWlzczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IHN3YXAgc3R5bGUgdG8gdXNlIGlmICoqW2h4LXN3YXBdKGh0dHBzOi8vaHRteC5vcmcvYXR0cmlidXRlcy9oeC1zd2FwKSoqIGlzIG9taXR0ZWQuXG4gICAgICAgKiBAdHlwZSBIdG14U3dhcFN0eWxlXG4gICAgICAgKiBAZGVmYXVsdCAnaW5uZXJIVE1MJ1xuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcFN0eWxlOiAnaW5uZXJIVE1MJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiByZWNlaXZpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGRvaW5nIHRoZSBzd2FwLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwRGVsYXk6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gY29tcGxldGluZyB0aGUgY29udGVudCBzd2FwIGFuZCBzZXR0bGluZyBhdHRyaWJ1dGVzLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U2V0dGxlRGVsYXk6IDIwLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0cnVlLCBodG14IHdpbGwgaW5qZWN0IGEgc21hbGwgYW1vdW50IG9mIENTUyBpbnRvIHRoZSBwYWdlIHRvIG1ha2UgaW5kaWNhdG9ycyBpbnZpc2libGUgdW5sZXNzIHRoZSAqKmh0bXgtaW5kaWNhdG9yKiogY2xhc3MgaXMgcHJlc2VudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaW5jbHVkZUluZGljYXRvclN0eWxlczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIGluZGljYXRvcnMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1pbmRpY2F0b3InXG4gICAgICAgKi9cbiAgICAgIGluZGljYXRvckNsYXNzOiAnaHRteC1pbmRpY2F0b3InLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdHJpZ2dlcmluZyBlbGVtZW50cyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXJlcXVlc3QnXG4gICAgICAgKi9cbiAgICAgIHJlcXVlc3RDbGFzczogJ2h0bXgtcmVxdWVzdCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byB0ZW1wb3JhcmlseSBwbGFjZSBvbiBlbGVtZW50cyB0aGF0IGh0bXggaGFzIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWFkZGVkJ1xuICAgICAgICovXG4gICAgICBhZGRlZENsYXNzOiAnaHRteC1hZGRlZCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc2V0dGxpbmcnXG4gICAgICAgKi9cbiAgICAgIHNldHRsaW5nQ2xhc3M6ICdodG14LXNldHRsaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHN3YXBwaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zd2FwcGluZydcbiAgICAgICAqL1xuICAgICAgc3dhcHBpbmdDbGFzczogJ2h0bXgtc3dhcHBpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvd3MgdGhlIHVzZSBvZiBldmFsLWxpa2UgZnVuY3Rpb25hbGl0eSBpbiBodG14LCB0byBlbmFibGUgKipoeC12YXJzKiosIHRyaWdnZXIgY29uZGl0aW9ucyAmIHNjcmlwdCB0YWcgZXZhbHVhdGlvbi4gQ2FuIGJlIHNldCB0byAqKmZhbHNlKiogZm9yIENTUCBjb21wYXRpYmlsaXR5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd0V2YWw6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byBmYWxzZSwgZGlzYWJsZXMgdGhlIGludGVycHJldGF0aW9uIG9mIHNjcmlwdCB0YWdzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd1NjcmlwdFRhZ3M6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHNjcmlwdHMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVNjcmlwdE5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc3R5bGVzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTdHlsZU5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGF0dHJpYnV0ZXMgdG8gc2V0dGxlIGR1cmluZyB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgICAgICogQGRlZmF1bHQgWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXVxuICAgICAgICovXG4gICAgICBhdHRyaWJ1dGVzVG9TZXR0bGU6IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93IGNyb3NzLXNpdGUgQWNjZXNzLUNvbnRyb2wgcmVxdWVzdHMgdXNpbmcgY3JlZGVudGlhbHMgc3VjaCBhcyBjb29raWVzLCBhdXRob3JpemF0aW9uIGhlYWRlcnMgb3IgVExTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgdGltZW91dDogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgKipnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheSoqIGZvciByZWNvbm5lY3RpbmcgYWZ0ZXIgdW5leHBlY3RlZCBjb25uZWN0aW9uIGxvc3MgYnkgdGhlIGV2ZW50IGNvZGUgKipBYm5vcm1hbCBDbG9zdXJlKiosICoqU2VydmljZSBSZXN0YXJ0Kiogb3IgKipUcnkgQWdhaW4gTGF0ZXIqKi5cbiAgICAgICAqIEB0eXBlIHsnZnVsbC1qaXR0ZXInIHwgKChyZXRyeUNvdW50Om51bWJlcikgPT4gbnVtYmVyKX1cbiAgICAgICAqIEBkZWZhdWx0IFwiZnVsbC1qaXR0ZXJcIlxuICAgICAgICovXG4gICAgICB3c1JlY29ubmVjdERlbGF5OiAnZnVsbC1qaXR0ZXInLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdHlwZSBvZiBiaW5hcnkgZGF0YSBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICogQHR5cGUgQmluYXJ5VHlwZVxuICAgICAgICogQGRlZmF1bHQgJ2Jsb2InXG4gICAgICAgKi9cbiAgICAgIHdzQmluYXJ5VHlwZTogJ2Jsb2InLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJ1xuICAgICAgICovXG4gICAgICBkaXNhYmxlU2VsZWN0b3I6ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgeydhdXRvJyB8ICdpbnN0YW50JyB8ICdzbW9vdGgnfVxuICAgICAgICogQGRlZmF1bHQgJ2luc3RhbnQnXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoZSBmb2N1c2VkIGVsZW1lbnQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdmlldy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRGb2N1c1Njcm9sbDogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBpbmNsdWRlIGEgY2FjaGUtYnVzdGluZyBwYXJhbWV0ZXIgaW4gR0VUIHJlcXVlc3RzIHRvIGF2b2lkIGNhY2hpbmcgcGFydGlhbCByZXNwb25zZXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdldENhY2hlQnVzdGVyUGFyYW06IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgaHRteCB3aWxsIHVzZSB0aGUgVmlldyBUcmFuc2l0aW9uIEFQSSB3aGVuIHN3YXBwaW5nIGluIG5ldyBjb250ZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2xvYmFsVmlld1RyYW5zaXRpb25zOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogaHRteCB3aWxsIGZvcm1hdCByZXF1ZXN0cyB3aXRoIHRoZXNlIG1ldGhvZHMgYnkgZW5jb2RpbmcgdGhlaXIgcGFyYW1ldGVycyBpbiB0aGUgVVJMLCBub3QgdGhlIHJlcXVlc3QgYm9keVxuICAgICAgICogQHR5cGUgeyhIdHRwVmVyYilbXX1cbiAgICAgICAqIEBkZWZhdWx0IFsnZ2V0JywgJ2RlbGV0ZSddXG4gICAgICAgKi9cbiAgICAgIG1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zOiBbJ2dldCcsICdkZWxldGUnXSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGRpc2FibGVzIGh0bXgtYmFzZWQgcmVxdWVzdHMgdG8gbm9uLW9yaWdpbiBob3N0cy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHNlbGZSZXF1ZXN0c09ubHk6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBub3QgdXBkYXRlIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQgd2hlbiBhIHRpdGxlIHRhZyBpcyBmb3VuZCBpbiBuZXcgY29udGVudFxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgaWdub3JlVGl0bGU6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgb2YgYSBib29zdGVkIGVsZW1lbnQgaXMgc2Nyb2xsZWQgaW50byB0aGUgdmlld3BvcnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEludG9WaWV3T25Cb29zdDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNhY2hlIHRvIHN0b3JlIGV2YWx1YXRlZCB0cmlnZ2VyIHNwZWNpZmljYXRpb25zIGludG8uXG4gICAgICAgKiBZb3UgbWF5IGRlZmluZSBhIHNpbXBsZSBvYmplY3QgdG8gdXNlIGEgbmV2ZXItY2xlYXJpbmcgY2FjaGUsIG9yIGltcGxlbWVudCB5b3VyIG93biBzeXN0ZW0gdXNpbmcgYSBbcHJveHkgb2JqZWN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSlcbiAgICAgICAqIEB0eXBlIHtPYmplY3R8bnVsbH1cbiAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAqL1xuICAgICAgdHJpZ2dlclNwZWNzQ2FjaGU6IG51bGwsXG4gICAgICAvKiogQHR5cGUgYm9vbGVhbiAqL1xuICAgICAgZGlzYWJsZUluaGVyaXRhbmNlOiBmYWxzZSxcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1tdICovXG4gICAgICByZXNwb25zZUhhbmRsaW5nOiBbXG4gICAgICAgIHsgY29kZTogJzIwNCcsIHN3YXA6IGZhbHNlIH0sXG4gICAgICAgIHsgY29kZTogJ1syM10uLicsIHN3YXA6IHRydWUgfSxcbiAgICAgICAgeyBjb2RlOiAnWzQ1XS4uJywgc3dhcDogZmFsc2UsIGVycm9yOiB0cnVlIH1cbiAgICAgIF0sXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gcHJvY2VzcyBPT0Igc3dhcHMgb24gZWxlbWVudHMgdGhhdCBhcmUgbmVzdGVkIHdpdGhpbiB0aGUgbWFpbiByZXNwb25zZSBlbGVtZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd05lc3RlZE9vYlN3YXBzOiB0cnVlXG4gICAgfSxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwYXJzZUludGVydmFsfSAqL1xuICAgIHBhcnNlSW50ZXJ2YWw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgaW50ZXJuYWxFdmFsfSAqL1xuICAgIF86IG51bGwsXG4gICAgdmVyc2lvbjogJzIuMC4yJ1xuICB9XG4gIC8vIFRzYyBtYWRuZXNzIHBhcnQgMlxuICBodG14Lm9uTG9hZCA9IG9uTG9hZEhlbHBlclxuICBodG14LnByb2Nlc3MgPSBwcm9jZXNzTm9kZVxuICBodG14Lm9uID0gYWRkRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC5vZmYgPSByZW1vdmVFdmVudExpc3RlbmVySW1wbFxuICBodG14LnRyaWdnZXIgPSB0cmlnZ2VyRXZlbnRcbiAgaHRteC5hamF4ID0gYWpheEhlbHBlclxuICBodG14LmZpbmQgPSBmaW5kXG4gIGh0bXguZmluZEFsbCA9IGZpbmRBbGxcbiAgaHRteC5jbG9zZXN0ID0gY2xvc2VzdFxuICBodG14LnJlbW92ZSA9IHJlbW92ZUVsZW1lbnRcbiAgaHRteC5hZGRDbGFzcyA9IGFkZENsYXNzVG9FbGVtZW50XG4gIGh0bXgucmVtb3ZlQ2xhc3MgPSByZW1vdmVDbGFzc0Zyb21FbGVtZW50XG4gIGh0bXgudG9nZ2xlQ2xhc3MgPSB0b2dnbGVDbGFzc09uRWxlbWVudFxuICBodG14LnRha2VDbGFzcyA9IHRha2VDbGFzc0ZvckVsZW1lbnRcbiAgaHRteC5zd2FwID0gc3dhcFxuICBodG14LmRlZmluZUV4dGVuc2lvbiA9IGRlZmluZUV4dGVuc2lvblxuICBodG14LnJlbW92ZUV4dGVuc2lvbiA9IHJlbW92ZUV4dGVuc2lvblxuICBodG14LmxvZ0FsbCA9IGxvZ0FsbFxuICBodG14LmxvZ05vbmUgPSBsb2dOb25lXG4gIGh0bXgucGFyc2VJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWxcbiAgaHRteC5fID0gaW50ZXJuYWxFdmFsXG5cbiAgY29uc3QgaW50ZXJuYWxBUEkgPSB7XG4gICAgYWRkVHJpZ2dlckhhbmRsZXIsXG4gICAgYm9keUNvbnRhaW5zLFxuICAgIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSxcbiAgICBmaW5kVGhpc0VsZW1lbnQsXG4gICAgZmlsdGVyVmFsdWVzLFxuICAgIHN3YXAsXG4gICAgaGFzQXR0cmlidXRlLFxuICAgIGdldEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0TWF0Y2gsXG4gICAgZ2V0RXhwcmVzc2lvblZhcnMsXG4gICAgZ2V0SGVhZGVycyxcbiAgICBnZXRJbnB1dFZhbHVlcyxcbiAgICBnZXRJbnRlcm5hbERhdGEsXG4gICAgZ2V0U3dhcFNwZWNpZmljYXRpb24sXG4gICAgZ2V0VHJpZ2dlclNwZWNzLFxuICAgIGdldFRhcmdldCxcbiAgICBtYWtlRnJhZ21lbnQsXG4gICAgbWVyZ2VPYmplY3RzLFxuICAgIG1ha2VTZXR0bGVJbmZvLFxuICAgIG9vYlN3YXAsXG4gICAgcXVlcnlTZWxlY3RvckV4dCxcbiAgICBzZXR0bGVJbW1lZGlhdGVseSxcbiAgICBzaG91bGRDYW5jZWwsXG4gICAgdHJpZ2dlckV2ZW50LFxuICAgIHRyaWdnZXJFcnJvckV2ZW50LFxuICAgIHdpdGhFeHRlbnNpb25zXG4gIH1cblxuICBjb25zdCBWRVJCUyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCddXG4gIGNvbnN0IFZFUkJfU0VMRUNUT1IgPSBWRVJCUy5tYXAoZnVuY3Rpb24odmVyYikge1xuICAgIHJldHVybiAnW2h4LScgKyB2ZXJiICsgJ10sIFtkYXRhLWh4LScgKyB2ZXJiICsgJ10nXG4gIH0pLmpvaW4oJywgJylcblxuICBjb25zdCBIRUFEX1RBR19SRUdFWCA9IG1ha2VUYWdSZWdFeCgnaGVhZCcpXG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXRpbGl0aWVzXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge1JlZ0V4cH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VUYWdSZWdFeCh0YWcsIGdsb2JhbCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYDwke3RhZ30oXFxcXHNbXj5dKj58PikoW1xcXFxzXFxcXFNdKj8pPFxcXFwvJHt0YWd9PmAsXG4gICAgICBnbG9iYWwgPyAnZ2ltJyA6ICdpbScpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIGludGVydmFsIHN0cmluZyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBodG14IGRvZXMuIFVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IGhhdmUgdGltaW5nLXJlbGF0ZWQgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQ2F1dGlvbjogQWNjZXB0cyBhbiBpbnQgZm9sbG93ZWQgYnkgZWl0aGVyICoqcyoqIG9yICoqbXMqKi4gQWxsIG90aGVyIHZhbHVlcyB1c2UgKipwYXJzZUZsb2F0KipcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcGFyc2VJbnRlcnZhbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRpbWluZyBzdHJpbmdcbiAgICogQHJldHVybnMge251bWJlcnx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUludGVydmFsKHN0cikge1xuICAgIGlmIChzdHIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgbGV0IGludGVydmFsID0gTmFOXG4gICAgaWYgKHN0ci5zbGljZSgtMikgPT0gJ21zJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMikpXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdzJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMFxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAnbScpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDAgKiA2MFxuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNOYU4oaW50ZXJ2YWwpID8gdW5kZWZpbmVkIDogaW50ZXJ2YWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmF3QXR0cmlidXRlKGVsdCwgbmFtZSkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGVsdC5nZXRBdHRyaWJ1dGUobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIC8vIHJlc29sdmUgd2l0aCBib3RoIGh4IGFuZCBkYXRhLWh4IHByZWZpeGVzXG4gIGZ1bmN0aW9uIGhhc0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gISFlbHQuaGFzQXR0cmlidXRlICYmIChlbHQuaGFzQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpIHx8XG4gICAgICBlbHQuaGFzQXR0cmlidXRlKCdkYXRhLScgKyBxdWFsaWZpZWROYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuIGdldFJhd0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHx8IGdldFJhd0F0dHJpYnV0ZShlbHQsICdkYXRhLScgKyBxdWFsaWZpZWROYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudEVsdChlbHQpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIGlmICghcGFyZW50ICYmIGVsdC5wYXJlbnROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkgcmV0dXJuIGVsdC5wYXJlbnROb2RlXG4gICAgcmV0dXJuIHBhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICAgIHJldHVybiBkb2N1bWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtOb2RlfERvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Um9vdE5vZGUoZWx0LCBnbG9iYWwpIHtcbiAgICByZXR1cm4gZWx0LmdldFJvb3ROb2RlID8gZWx0LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IGdsb2JhbCB9KSA6IGdldERvY3VtZW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0geyhlOk5vZGUpID0+IGJvb2xlYW59IGNvbmRpdGlvblxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0TWF0Y2goZWx0LCBjb25kaXRpb24pIHtcbiAgICB3aGlsZSAoZWx0ICYmICFjb25kaXRpb24oZWx0KSkge1xuICAgICAgZWx0ID0gcGFyZW50RWx0KGVsdClcbiAgICB9XG5cbiAgICByZXR1cm4gZWx0IHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGluaXRpYWxFbGVtZW50XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gYW5jZXN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoaW5pdGlhbEVsZW1lbnQsIGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBkaXNpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1kaXNpbmhlcml0JylcbiAgICB2YXIgaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtaW5oZXJpdCcpXG4gICAgaWYgKGluaXRpYWxFbGVtZW50ICE9PSBhbmNlc3Rvcikge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmRpc2FibGVJbmhlcml0YW5jZSkge1xuICAgICAgICBpZiAoaW5oZXJpdCAmJiAoaW5oZXJpdCA9PT0gJyonIHx8IGluaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpc2luaGVyaXQgJiYgKGRpc2luaGVyaXQgPT09ICcqJyB8fCBkaXNpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICByZXR1cm4gJ3Vuc2V0J1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBsZXQgY2xvc2VzdEF0dHIgPSBudWxsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuICEhKGNsb3Nlc3RBdHRyID0gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoZWx0LCBhc0VsZW1lbnQoZSksIGF0dHJpYnV0ZU5hbWUpKVxuICAgIH0pXG4gICAgaWYgKGNsb3Nlc3RBdHRyICE9PSAndW5zZXQnKSB7XG4gICAgICByZXR1cm4gY2xvc2VzdEF0dHJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMgZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRWYXJpYWJsZVxuICAgIGNvbnN0IG1hdGNoZXNGdW5jdGlvbiA9IGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgKGVsdC5tYXRjaGVzIHx8IGVsdC5tYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWx0LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbHQub01hdGNoZXNTZWxlY3RvcilcbiAgICByZXR1cm4gISFtYXRjaGVzRnVuY3Rpb24gJiYgbWF0Y2hlc0Z1bmN0aW9uLmNhbGwoZWx0LCBzZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdGFydFRhZyhzdHIpIHtcbiAgICBjb25zdCB0YWdNYXRjaGVyID0gLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pXG4gICAgY29uc3QgbWF0Y2ggPSB0YWdNYXRjaGVyLmV4ZWMoc3RyKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSFRNTChyZXNwKSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpXG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcCwgJ3RleHQvaHRtbCcpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBlbHQpIHtcbiAgICB3aGlsZSAoZWx0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsdC5jaGlsZE5vZGVzWzBdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge0hUTUxTY3JpcHRFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZHVwbGljYXRlU2NyaXB0KHNjcmlwdCkge1xuICAgIGNvbnN0IG5ld1NjcmlwdCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICBmb3JFYWNoKHNjcmlwdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBuZXdTY3JpcHQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICB9KVxuICAgIG5ld1NjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdC50ZXh0Q29udGVudFxuICAgIG5ld1NjcmlwdC5hc3luYyA9IGZhbHNlXG4gICAgaWYgKGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlKSB7XG4gICAgICBuZXdTY3JpcHQubm9uY2UgPSBodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZVxuICAgIH1cbiAgICByZXR1cm4gbmV3U2NyaXB0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpIHtcbiAgICByZXR1cm4gc2NyaXB0Lm1hdGNoZXMoJ3NjcmlwdCcpICYmIChzY3JpcHQudHlwZSA9PT0gJ3RleHQvamF2YXNjcmlwdCcgfHwgc2NyaXB0LnR5cGUgPT09ICdtb2R1bGUnIHx8IHNjcmlwdC50eXBlID09PSAnJylcbiAgfVxuXG4gIC8qKlxuICAgKiB3ZSBoYXZlIHRvIG1ha2UgbmV3IGNvcGllcyBvZiBzY3JpcHQgdGFncyB0aGF0IHdlIGFyZSBnb2luZyB0byBpbnNlcnQgYmVjYXVzZVxuICAgKiBTT01FIGJyb3dzZXJzIChub3Qgc2F5aW5nIHdobywgYnV0IGl0IGludm9sdmVzIGFuIGVsZW1lbnQgYW5kIGFuIGFuaW1hbCkgZG9uJ3RcbiAgICogZXhlY3V0ZSBzY3JpcHRzIGNyZWF0ZWQgaW4gPHRlbXBsYXRlPiB0YWdzIHdoZW4gdGhleSBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXG4gICAqIGFuZCBhbGwgdGhlIG90aGVycyBkbyBsbWFvXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpIHtcbiAgICBBcnJheS5mcm9tKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpKS5mb3JFYWNoKC8qKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHQgKi8gKHNjcmlwdCkgPT4ge1xuICAgICAgaWYgKGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSkge1xuICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBzY3JpcHQucGFyZW50Tm9kZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3U2NyaXB0LCBzY3JpcHQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7RG9jdW1lbnRGcmFnbWVudCAmIHt0aXRsZT86IHN0cmluZ319IERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGVcbiAgICogQGRlc2NyaXB0aW9uICBhIGRvY3VtZW50IGZyYWdtZW50IHJlcHJlc2VudGluZyB0aGUgcmVzcG9uc2UgSFRNTCwgaW5jbHVkaW5nXG4gICAqIGEgYHRpdGxlYCBwcm9wZXJ0eSBmb3IgYW55IHRpdGxlIGluZm9ybWF0aW9uIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2UgSFRNTFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VGcmFnbWVudChyZXNwb25zZSkge1xuICAgIC8vIHN0cmlwIGhlYWQgdGFnIHRvIGRldGVybWluZSBzaGFwZSBvZiByZXNwb25zZSB3ZSBhcmUgZGVhbGluZyB3aXRoXG4gICAgY29uc3QgcmVzcG9uc2VXaXRoTm9IZWFkID0gcmVzcG9uc2UucmVwbGFjZShIRUFEX1RBR19SRUdFWCwgJycpXG4gICAgY29uc3Qgc3RhcnRUYWcgPSBnZXRTdGFydFRhZyhyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi9cbiAgICBsZXQgZnJhZ21lbnRcbiAgICBpZiAoc3RhcnRUYWcgPT09ICdodG1sJykge1xuICAgICAgLy8gaWYgaXQgaXMgYSBmdWxsIGRvY3VtZW50LCBwYXJzZSBpdCBhbmQgcmV0dXJuIHRoZSBib2R5XG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIGlmIChzdGFydFRhZyA9PT0gJ2JvZHknKSB7XG4gICAgICAvLyBwYXJzZSBib2R5IHcvbyB3cmFwcGluZyBpbiB0ZW1wbGF0ZVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgbm9uLWJvZHkgcGFydGlhbCBIVE1MIGNvbnRlbnQsIHNvIHdyYXAgaXQgaW4gYSB0ZW1wbGF0ZSB0byBtYXhpbWl6ZSBwYXJzaW5nIGZsZXhpYmlsaXR5XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwoJzxib2R5Pjx0ZW1wbGF0ZSBjbGFzcz1cImludGVybmFsLWh0bXgtd3JhcHBlclwiPicgKyByZXNwb25zZVdpdGhOb0hlYWQgKyAnPC90ZW1wbGF0ZT48L2JvZHk+JylcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKGRvYy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpLmNvbnRlbnQpXG4gICAgICAvLyBleHRyYWN0IHRpdGxlIGludG8gZnJhZ21lbnQgZm9yIGxhdGVyIHByb2Nlc3NpbmdcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG5cbiAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyB3ZSBzdXBwb3J0IGEgdGl0bGUgdGFnIGF0IHRoZSByb290IGxldmVsIG9mIG5vbi1ib2R5IHJlc3BvbnNlcywgc28gd2UgbmVlZCB0byBoYW5kbGUgaXRcbiAgICAgIHZhciB0aXRsZUVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbGVtZW50ICYmIHRpdGxlRWxlbWVudC5wYXJlbnROb2RlID09PSBmcmFnbWVudCkge1xuICAgICAgICB0aXRsZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgICAgZnJhZ21lbnQudGl0bGUgPSB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93U2NyaXB0VGFncykge1xuICAgICAgICBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBzY3JpcHQgdGFncyBpZiBzY3JpcHRzIGFyZSBkaXNhYmxlZFxuICAgICAgICBmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKS5mb3JFYWNoKChzY3JpcHQpID0+IHNjcmlwdC5yZW1vdmUoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVDYWxsKGZ1bmMpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgZnVuYygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBpc1R5cGUobywgdHlwZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIEZ1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIE9iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUmF3T2JqZWN0KG8pIHtcbiAgICByZXR1cm4gaXNUeXBlKG8sICdPYmplY3QnKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9uSGFuZGxlclxuICAgKiBAcHJvcGVydHkgeyhrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwKXxzdHJpbmd9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RlbmVySW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IG9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14Tm9kZUludGVybmFsRGF0YVxuICAgKiBFbGVtZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbml0SGFzaF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYm9vc3RlZF1cbiAgICogQHByb3BlcnR5IHtPbkhhbmRsZXJbXX0gW29uSGFuZGxlcnNdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHByb3BlcnR5IHtMaXN0ZW5lckluZm9bXX0gW2xpc3RlbmVySW5mb3NdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhbmNlbGxlZF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdHJpZ2dlcmVkT25jZV1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheWVkXVxuICAgKiBAcHJvcGVydHkge251bWJlcnxudWxsfSBbdGhyb3R0bGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFzdFZhbHVlXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2FkZWRdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJiXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwb2xsaW5nXVxuICAgKiBAcHJvcGVydHkge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8bnVsbH0gW2xhc3RCdXR0b25DbGlja2VkXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3JlcXVlc3RDb3VudF1cbiAgICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0gW3hocl1cbiAgICogQHByb3BlcnR5IHsoKCkgPT4gdm9pZClbXX0gW3F1ZXVlZFJlcXVlc3RzXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthYm9ydGFibGVdXG4gICAqXG4gICAqIEV2ZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IFt0cmlnZ2VyU3BlY11cbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldFtdfSBbaGFuZGxlZEZvcl1cbiAgICovXG5cbiAgLyoqXG4gICAqIGdldEludGVybmFsRGF0YSByZXRyaWV2ZXMgXCJwcml2YXRlXCIgZGF0YSBzdG9yZWQgYnkgaHRteCB3aXRoaW4gYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEV2ZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxEYXRhKGVsdCkge1xuICAgIGNvbnN0IGRhdGFQcm9wID0gJ2h0bXgtaW50ZXJuYWwtZGF0YSdcbiAgICBsZXQgZGF0YSA9IGVsdFtkYXRhUHJvcF1cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGRhdGEgPSBlbHRbZGF0YVByb3BdID0ge31cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0FycmF5IGNvbnZlcnRzIGFuIEFycmF5TGlrZSBvYmplY3QgaW50byBhIHJlYWwgYXJyYXkuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHJldHVybnMge1RbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkoYXJyKSB7XG4gICAgY29uc3QgcmV0dXJuQXJyID0gW11cbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXR1cm5BcnIucHVzaChhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5BcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1RbXXxOYW1lZE5vZGVNYXB8SFRNTENvbGxlY3Rpb258SFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb258QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHBhcmFtIHsoVCkgPT4gdm9pZH0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gZm9yRWFjaChhcnIsIGZ1bmMpIHtcbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBmdW5jKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsZWRJbnRvVmlldyhlbCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGVsZW1Ub3AgPSByZWN0LnRvcFxuICAgIGNvbnN0IGVsZW1Cb3R0b20gPSByZWN0LmJvdHRvbVxuICAgIHJldHVybiBlbGVtVG9wIDwgd2luZG93LmlubmVySGVpZ2h0ICYmIGVsZW1Cb3R0b20gPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gYm9keUNvbnRhaW5zKGVsdCkge1xuICAgIC8vIElFIEZpeFxuICAgIGNvbnN0IHJvb3ROb2RlID0gZWx0LmdldFJvb3ROb2RlICYmIGVsdC5nZXRSb290Tm9kZSgpXG4gICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QpIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMocm9vdE5vZGUuaG9zdClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHNwbGl0T25XaGl0ZXNwYWNlKHRyaWdnZXIpIHtcbiAgICByZXR1cm4gdHJpZ2dlci50cmltKCkuc3BsaXQoL1xccysvKVxuICB9XG5cbiAgLyoqXG4gICAqIG1lcmdlT2JqZWN0cyB0YWtlcyBhbGwgdGhlIGtleXMgZnJvbVxuICAgKiBvYmoyIGFuZCBkdXBsaWNhdGVzIHRoZW0gaW50byBvYmoxXG4gICAqIEB0ZW1wbGF0ZSBUMVxuICAgKiBAdGVtcGxhdGUgVDJcbiAgICogQHBhcmFtIHtUMX0gb2JqMVxuICAgKiBAcGFyYW0ge1QyfSBvYmoyXG4gICAqIEByZXR1cm5zIHtUMSAmIFQyfVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmoyKSB7XG4gICAgICBpZiAob2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgcmV0dXJuIG9iajFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30galN0cmluZ1xuICAgKiBAcmV0dXJucyB7YW55fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUpTT04oalN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShqU3RyaW5nKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dFcnJvcihlcnJvcilcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkge1xuICAgIGNvbnN0IHRlc3QgPSAnaHRteDpsb2NhbFN0b3JhZ2VUZXN0J1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KVxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoKVxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBwYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCB1bmxlc3MgaW5kZXggcGFnZVxuICAgICAgaWYgKCEoL15cXC8kLy50ZXN0KHBhdGgpKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBiZSBraW5kIHRvIElFMTEsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBVUkwoKVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHVibGljIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gaW50ZXJuYWxFdmFsKHN0cikge1xuICAgIHJldHVybiBtYXliZUV2YWwoZ2V0RG9jdW1lbnQoKS5ib2R5LCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBldmFsKHN0cilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjYWxsYmFjayBmb3IgdGhlICoqaHRteDpsb2FkKiogZXZlbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvY2VzcyBuZXcgY29udGVudCwgZm9yIGV4YW1wbGUgaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50IHdpdGggYSBqYXZhc2NyaXB0IGxpYnJhcnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25Mb2FkXG4gICAqXG4gICAqIEBwYXJhbSB7KGVsdDogTm9kZSkgPT4gdm9pZH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGNhbGwgb24gbmV3bHkgbG9hZGVkIGNvbnRlbnRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvbkxvYWRIZWxwZXIoY2FsbGJhY2spIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0bXgub24oJ2h0bXg6bG9hZCcsIC8qKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldnQgKi8gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjYWxsYmFjayhldnQuZGV0YWlsLmVsdClcbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIExvZyBhbGwgaHRteCBldmVudHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dBbGxcbiAgICovXG4gIGZ1bmN0aW9uIGxvZ0FsbCgpIHtcbiAgICBodG14LmxvZ2dlciA9IGZ1bmN0aW9uKGVsdCwgZXZlbnQsIGRhdGEpIHtcbiAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LCBlbHQsIGRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nTm9uZSgpIHtcbiAgICBodG14LmxvZ2dlciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudCBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZEFsbFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudHMgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD59XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQWxsKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRBbGwoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgV2luZG93XG4gICAqL1xuICBmdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHdpbmRvd1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsdCwgZGVsYXkpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUVsZW1lbnQoZWx0KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RWx0KGVsdCkucmVtb3ZlQ2hpbGQoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0h0bWxFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqIEByZXR1cm4ge1BhcmVudE5vZGV8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzUGFyZW50Tm9kZShlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFkZHMgYSBjbGFzcyB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWRkQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgY2xhc3MgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byBhZGRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSBjbGFzcyBpcyBhZGRlZFxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eiwgZGVsYXkpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0LmNsYXNzTGlzdCAmJiBlbHQuY2xhc3NMaXN0LmFkZChjbGF6eilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsYXNzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gbm9kZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgY2xhc3MgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgY2xhc3MgaXMgcmVtb3ZlZClcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQobm9kZSwgY2xhenosIGRlbGF5KSB7XG4gICAgbGV0IGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KG5vZGUpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShjbGF6eilcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGNsYXNzZXMgbGVmdCwgcmVtb3ZlIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGdpdmVuIGNsYXNzIG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdG9nZ2xlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRvZ2dsZSB0aGUgY2xhc3Mgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0b2dnbGVcbiAgICovXG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzT25FbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBlbHQuY2xhc3NMaXN0LnRvZ2dsZShjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSBpdHMgc2libGluZ3MsIHNvIHRoYXQgYW1vbmcgaXRzIHNpYmxpbmdzLCBvbmx5IHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Rha2VDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRha2UgdGhlIGNsYXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdGFrZVxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNsYXNzRm9yRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZm9yRWFjaChlbHQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXp6KVxuICAgIH0pXG4gICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGVsdCksIGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjbG9zZXN0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzIHBhcmVudGFnZSwgaW5jbHVzaXZlIG9mIHRoZSBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2Nsb3Nlc3RcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIHNlbGVjdG9yIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBmaW5kXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZXN0KGVsdCwgc2VsZWN0b3IpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmIChlbHQgJiYgZWx0LmNsb3Nlc3QpIHtcbiAgICAgIHJldHVybiBlbHQuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyByZW1vdmUgd2hlbiBJRSBnb2VzIGF3YXlcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGVsdCA9PSBudWxsIHx8IG1hdGNoZXMoZWx0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbHQgPSBlbHQgJiYgYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSlcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwcmVmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzdWZmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgPT09IHN1ZmZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICBjb25zdCB0cmltbWVkU2VsZWN0b3IgPSBzZWxlY3Rvci50cmltKClcbiAgICBpZiAoc3RhcnRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICc8JykgJiYgZW5kc1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnLz4nKSkge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3Rvci5zdWJzdHJpbmcoMSwgdHJpbW1lZFNlbGVjdG9yLmxlbmd0aCAtIDIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfEVsZW1lbnR8RG9jdW1lbnR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLCBnbG9iYWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoc2VsZWN0b3IuaW5kZXhPZignY2xvc2VzdCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtjbG9zZXN0KGFzRWxlbWVudChlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOCkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2ZpbmQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbZmluZChhc1BhcmVudE5vZGUoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ25leHQnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLm5leHRFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ25leHQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkZvcndhcmRRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncHJldmlvdXMnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdwcmV2aW91cyAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuQmFja3dhcmRzUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudF1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnd2luZG93Jykge1xuICAgICAgcmV0dXJuIFt3aW5kb3ddXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2JvZHknKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50LmJvZHldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3Jvb3QnKSB7XG4gICAgICByZXR1cm4gW2dldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZ2xvYmFsICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLnNsaWNlKDcpLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdG9BcnJheShhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkZvcndhcmRRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5CYWNrd2FyZHNRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd31cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3RvcilbMF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZ2V0RG9jdW1lbnQoKS5ib2R5LCBlbHRPclNlbGVjdG9yKVswXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge0V2ZW50VGFyZ2V0fSBUXG4gICAqIEBwYXJhbSB7VHxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtUfSBbY29udGV4dF1cbiAgICogQHJldHVybnMge0VsZW1lbnR8VHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVRhcmdldChlbHRPclNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZpbmQoYXNQYXJlbnROb2RlKGNvbnRleHQpIHx8IGRvY3VtZW50LCBlbHRPclNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7a2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcHxzdHJpbmd9IEFueUV2ZW50TmFtZVxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXZlbnRBcmdzXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICAgKiBAcHJvcGVydHkge0FueUV2ZW50TmFtZX0gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxBbnlFdmVudE5hbWV9IGFyZzFcbiAgICogQHBhcmFtIHtBbnlFdmVudE5hbWV8RXZlbnRMaXN0ZW5lcn0gYXJnMlxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXVxuICAgKiBAcmV0dXJucyB7RXZlbnRBcmdzfVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oYXJnMikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogZ2V0RG9jdW1lbnQoKS5ib2R5LFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMSksXG4gICAgICAgIGxpc3RlbmVyOiBhcmcyXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogcmVzb2x2ZVRhcmdldChhcmcxKSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzIpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnM1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBsaXN0ZW5lciB0byB8IHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3IgfCB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICBjb25zdCBiID0gaXNGdW5jdGlvbihhcmcyKVxuICAgIHJldHVybiBiID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvZmZcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oYXJnMikgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTm9kZSBwcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3QgRFVNTVlfRUxUID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdvdXRwdXQnKSAvLyBkdW1teSBlbGVtZW50IGZvciBiYWQgc2VsZWN0b3JzXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ck5hbWVcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgYXR0ck5hbWUpIHtcbiAgICBjb25zdCBhdHRyVGFyZ2V0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0ck5hbWUpXG4gICAgaWYgKGF0dHJUYXJnZXQpIHtcbiAgICAgIGlmIChhdHRyVGFyZ2V0ID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIFtmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyTmFtZSldXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgYXR0clRhcmdldClcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsb2dFcnJvcignVGhlIHNlbGVjdG9yIFwiJyArIGF0dHJUYXJnZXQgKyAnXCIgb24gJyArIGF0dHJOYW1lICsgJyByZXR1cm5lZCBubyBtYXRjaGVzIScpXG4gICAgICAgICAgcmV0dXJuIFtEVU1NWV9FTFRdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBhc0VsZW1lbnQoZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoYXNFbGVtZW50KGVsdCksIGF0dHJpYnV0ZSkgIT0gbnVsbFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VGFyZ2V0KGVsdCkge1xuICAgIGNvbnN0IHRhcmdldFN0ciA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKVxuICAgIGlmICh0YXJnZXRTdHIpIHtcbiAgICAgIGlmICh0YXJnZXRTdHIgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRhcmdldFN0cilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAoZGF0YS5ib29zdGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUobmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXNUb1NldHRsZSA9IGh0bXguY29uZmlnLmF0dHJpYnV0ZXNUb1NldHRsZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlc1RvU2V0dGxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmFtZSA9PT0gYXR0cmlidXRlc1RvU2V0dGxlW2ldKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VUb1xuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlRnJvbVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvbmVBdHRyaWJ1dGVzKG1lcmdlVG8sIG1lcmdlRnJvbSkge1xuICAgIGZvckVhY2gobWVyZ2VUby5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoIW1lcmdlRnJvbS5oYXNBdHRyaWJ1dGUoYXR0ci5uYW1lKSAmJiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKG1lcmdlRnJvbS5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpIHtcbiAgICBjb25zdCBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyh0YXJnZXQpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzSW5saW5lU3dhcChzd2FwU3R5bGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFN0eWxlID09PSAnb3V0ZXJIVE1MJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvb2JWYWx1ZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9vYkVsZW1lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGxldCBzZWxlY3RvciA9ICcjJyArIGdldFJhd0F0dHJpYnV0ZShvb2JFbGVtZW50LCAnaWQnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFN0eWxlICovXG4gICAgbGV0IHN3YXBTdHlsZSA9ICdvdXRlckhUTUwnXG4gICAgaWYgKG9vYlZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKG9vYlZhbHVlLmluZGV4T2YoJzonKSA+IDApIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlLnN1YnN0cigwLCBvb2JWYWx1ZS5pbmRleE9mKCc6JykpXG4gICAgICBzZWxlY3RvciA9IG9vYlZhbHVlLnN1YnN0cihvb2JWYWx1ZS5pbmRleE9mKCc6JykgKyAxLCBvb2JWYWx1ZS5sZW5ndGgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICBpZiAodGFyZ2V0cykge1xuICAgICAgZm9yRWFjaChcbiAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgICAgbGV0IGZyYWdtZW50XG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudENsb25lID0gb29iRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICBmcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQob29iRWxlbWVudENsb25lKVxuICAgICAgICAgIGlmICghaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBhc1BhcmVudE5vZGUob29iRWxlbWVudENsb25lKSAvLyBpZiB0aGlzIGlzIG5vdCBhbiBpbmxpbmUgc3dhcCwgd2UgdXNlIHRoZSBjb250ZW50IG9mIHRoZSBub2RlLCBub3QgdGhlIG5vZGUgaXRzZWxmXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlU3dhcERldGFpbHMgPSB7IHNob3VsZFN3YXA6IHRydWUsIHRhcmdldCwgZnJhZ21lbnQgfVxuICAgICAgICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6b29iQmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICAgICAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgICAgICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgICAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCB0YXJnZXQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14Om9vYkFmdGVyU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6b29iRXJyb3JOb1RhcmdldCcsIHsgY29udGVudDogb29iRWxlbWVudCB9KVxuICAgIH1cbiAgICByZXR1cm4gb29iVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudCkge1xuICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ1toeC1wcmVzZXJ2ZV0sIFtkYXRhLWh4LXByZXNlcnZlXScpLCBmdW5jdGlvbihwcmVzZXJ2ZWRFbHQpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0QXR0cmlidXRlVmFsdWUocHJlc2VydmVkRWx0LCAnaWQnKVxuICAgICAgY29uc3Qgb2xkRWx0ID0gZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgIGlmIChvbGRFbHQgIT0gbnVsbCkge1xuICAgICAgICBwcmVzZXJ2ZWRFbHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQob2xkRWx0LCBwcmVzZXJ2ZWRFbHQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyksIGZ1bmN0aW9uKG5ld05vZGUpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UmF3QXR0cmlidXRlKG5ld05vZGUsICdpZCcpXG4gICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkSWQgPSBpZC5yZXBsYWNlKFwiJ1wiLCBcIlxcXFwnXCIpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYWcgPSBuZXdOb2RlLnRhZ05hbWUucmVwbGFjZSgnOicsICdcXFxcOicpXG4gICAgICAgIGNvbnN0IHBhcmVudEVsdCA9IGFzUGFyZW50Tm9kZShwYXJlbnROb2RlKVxuICAgICAgICBjb25zdCBvbGROb2RlID0gcGFyZW50RWx0ICYmIHBhcmVudEVsdC5xdWVyeVNlbGVjdG9yKG5vcm1hbGl6ZWRUYWcgKyBcIltpZD0nXCIgKyBub3JtYWxpemVkSWQgKyBcIiddXCIpXG4gICAgICAgIGlmIChvbGROb2RlICYmIG9sZE5vZGUgIT09IHBhcmVudEVsdCkge1xuICAgICAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBuZXdOb2RlLmNsb25lTm9kZSgpXG4gICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG9sZE5vZGUpXG4gICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG5ld0F0dHJpYnV0ZXMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBjaGlsZFxuICAgKiBAcmV0dXJucyB7SHRteFNldHRsZVRhc2t9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlQWpheExvYWRUYXNrKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHByb2Nlc3NOb2RlKGFzRWxlbWVudChjaGlsZCkpXG4gICAgICBwcm9jZXNzRm9jdXMoYXNQYXJlbnROb2RlKGNoaWxkKSlcbiAgICAgIHRyaWdnZXJFdmVudChjaGlsZCwgJ2h0bXg6bG9hZCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gY2hpbGRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NGb2N1cyhjaGlsZCkge1xuICAgIGNvbnN0IGF1dG9mb2N1cyA9ICdbYXV0b2ZvY3VzXSdcbiAgICBjb25zdCBhdXRvRm9jdXNlZEVsdCA9IGFzSHRtbEVsZW1lbnQobWF0Y2hlcyhjaGlsZCwgYXV0b2ZvY3VzKSA/IGNoaWxkIDogY2hpbGQucXVlcnlTZWxlY3RvcihhdXRvZm9jdXMpKVxuICAgIGlmIChhdXRvRm9jdXNlZEVsdCAhPSBudWxsKSB7XG4gICAgICBhdXRvRm9jdXNlZEVsdC5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge05vZGV9IGluc2VydEJlZm9yZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydEJlZm9yZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIHdoaWxlIChmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZFxuICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGNoaWxkKSwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbnNlcnRCZWZvcmUpXG4gICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJhc2VkIG9uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2h5YW1hbW90by9mZDQzNTUwNWQyOWViZmEzZDk3MTZmZDJiZThkNDJmMCxcbiAgICogZGVyaXZlZCBmcm9tIEphdmEncyBzdHJpbmcgaGFzaGNvZGUgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaGFzaFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nSGFzaChzdHJpbmcsIGhhc2gpIHtcbiAgICBsZXQgY2hhciA9IDBcbiAgICB3aGlsZSAoY2hhciA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBzdHJpbmcuY2hhckNvZGVBdChjaGFyKyspIHwgMCAvLyBiaXR3aXNlIG9yIGVuc3VyZXMgd2UgaGF2ZSBhIDMyLWJpdCBpbnRcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYXR0cmlidXRlSGFzaChlbHQpIHtcbiAgICBsZXQgaGFzaCA9IDBcbiAgICAvLyBJRSBmaXhcbiAgICBpZiAoZWx0LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWx0LmF0dHJpYnV0ZXNbaV1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZS52YWx1ZSkgeyAvLyBvbmx5IGluY2x1ZGUgYXR0cmlidXRlcyB3LyBhY3R1YWwgdmFsdWVzIChlbXB0eSBpcyBzYW1lIGFzIG5vbi1leGlzdGVudClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUubmFtZSwgaGFzaClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUudmFsdWUsIGhhc2gpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE9uSGFuZGxlcnMoZWx0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZm8gPSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1tpXVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChlbHQsIGhhbmRsZXJJbmZvLmV2ZW50LCBoYW5kbGVySW5mby5saXN0ZW5lcilcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE5vZGUoZWxlbWVudCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbGVtZW50KVxuICAgIGlmIChpbnRlcm5hbERhdGEudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVybmFsRGF0YS50aW1lb3V0KVxuICAgIH1cbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MpIHtcbiAgICAgIGZvckVhY2goaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MsIGZ1bmN0aW9uKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8ub24pIHtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChpbmZvLm9uLCBpbmZvLnRyaWdnZXIsIGluZm8ubGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWxlbWVudClcbiAgICBmb3JFYWNoKE9iamVjdC5rZXlzKGludGVybmFsRGF0YSksIGZ1bmN0aW9uKGtleSkgeyBkZWxldGUgaW50ZXJuYWxEYXRhW2tleV0gfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuVXBFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKVxuICAgIGRlSW5pdE5vZGUoZWxlbWVudClcbiAgICAvLyBAdHMtaWdub3JlIElFMTEgY29kZVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikgeyAvLyBJRVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yRWFjaChlbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkgeyBjbGVhblVwRWxlbWVudChjaGlsZCkgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiB0YXJnZXQudGFnTmFtZSA9PT0gJ0JPRFknKSB7IC8vIHNwZWNpYWwgY2FzZSB0aGUgYm9keSB0byBpbm5lckhUTUwgYmVjYXVzZSBEb2N1bWVudEZyYWdtZW50cyBjYW4ndCBjb250YWluIGEgYm9keSBlbHQgdW5mb3J0dW5hdGVseVxuICAgICAgcmV0dXJuIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtOb2RlfSAqL1xuICAgIGxldCBuZXdFbHRcbiAgICBjb25zdCBlbHRCZWZvcmVOZXdDb250ZW50ID0gdGFyZ2V0LnByZXZpb3VzU2libGluZ1xuICAgIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChlbHRCZWZvcmVOZXdDb250ZW50ID09IG51bGwpIHtcbiAgICAgIG5ld0VsdCA9IHBhcmVudEVsdCh0YXJnZXQpLmZpcnN0Q2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWx0ID0gZWx0QmVmb3JlTmV3Q29udGVudC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBzZXR0bGVJbmZvLmVsdHMgPSBzZXR0bGVJbmZvLmVsdHMuZmlsdGVyKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUgIT09IHRhcmdldCB9KVxuICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgbmV3bHkgYWRkZWQgY29udGVudCBhbmQgYWRkIGFsbCBlbGVtZW50cyB0byB0aGUgc2V0dGxlIGluZm8gc28gd2UgdHJpZ2dlclxuICAgIC8vIGV2ZW50cyBwcm9wZXJseSBvbiB0aGVtXG4gICAgd2hpbGUgKG5ld0VsdCAmJiBuZXdFbHQgIT09IHRhcmdldCkge1xuICAgICAgaWYgKG5ld0VsdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgc2V0dGxlSW5mby5lbHRzLnB1c2gobmV3RWx0KVxuICAgICAgfVxuICAgICAgbmV3RWx0ID0gbmV3RWx0Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGFyZ2V0LnJlbW92ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgdGFyZ2V0LmZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBudWxsLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQubmV4dFNpYmxpbmcsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqL1xuICBmdW5jdGlvbiBzd2FwRGVsZXRlKHRhcmdldCkge1xuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICByZXR1cm4gcGFyZW50RWx0KHRhcmdldCkucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgY29uc3QgZmlyc3RDaGlsZCA9IHRhcmdldC5maXJzdENoaWxkXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBmaXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgd2hpbGUgKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICB9XG4gICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkKVxuICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHN3aXRjaCAoc3dhcFN0eWxlKSB7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdvdXRlckhUTUwnOlxuICAgICAgICBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJiZWdpbic6XG4gICAgICAgIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlYmVnaW4nOlxuICAgICAgICBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmVlbmQnOlxuICAgICAgICBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJlbmQnOlxuICAgICAgICBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBzd2FwRGVsZXRlKHRhcmdldClcbiAgICAgICAgcmV0dXJuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMoZWx0KVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBleHRlbnNpb25zW2ldXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZXh0LmhhbmRsZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0VsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGhhbmRsZVN3YXAgcmV0dXJucyBhbiBhcnJheSAobGlrZSkgb2YgZWxlbWVudHMsIHdlIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdFbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBuZXdFbGVtZW50c1tqXVxuICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3dhcFN0eWxlID09PSAnaW5uZXJIVE1MJykge1xuICAgICAgICAgIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2FwV2l0aFN0eWxlKGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICB2YXIgb29iRWx0cyA9IGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtc3dhcC1vb2JdLCBbZGF0YS1oeC1zd2FwLW9vYl0nKVxuICAgIGZvckVhY2gob29iRWx0cywgZnVuY3Rpb24ob29iRWxlbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93TmVzdGVkT29iU3dhcHMgfHwgb29iRWxlbWVudC5wYXJlbnRFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG9vYlZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUob29iRWxlbWVudCwgJ2h4LXN3YXAtb29iJylcbiAgICAgICAgaWYgKG9vYlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaHgtc3dhcC1vb2InKVxuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oeC1zd2FwLW9vYicpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gb29iRWx0cy5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBjb21wbGV0ZSBzd2FwcGluZyBwaXBlbGluZSwgaW5jbHVkaW5nOiBmb2N1cyBhbmQgc2VsZWN0aW9uIHByZXNlcnZhdGlvbixcbiAgICogdGl0bGUgdXBkYXRlcywgc2Nyb2xsLCBPT0Igc3dhcHBpbmcsIG5vcm1hbCBzd2FwcGluZyBhbmQgc2V0dGxpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKiBAcGFyYW0ge1N3YXBPcHRpb25zfSBbc3dhcE9wdGlvbnNdXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwKHRhcmdldCwgY29udGVudCwgc3dhcFNwZWMsIHN3YXBPcHRpb25zKSB7XG4gICAgaWYgKCFzd2FwT3B0aW9ucykge1xuICAgICAgc3dhcE9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIHRhcmdldCA9IHJlc29sdmVUYXJnZXQodGFyZ2V0KVxuXG4gICAgLy8gcHJlc2VydmUgZm9jdXMgYW5kIHNlbGVjdGlvblxuICAgIGNvbnN0IGFjdGl2ZUVsdCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICBsZXQgc2VsZWN0aW9uSW5mbyA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIHNlbGVjdGlvbkluZm8gPSB7XG4gICAgICAgIGVsdDogYWN0aXZlRWx0LFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXJ0OiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uU3RhcnQgOiBudWxsLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVuZDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvbkVuZCA6IG51bGxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzYWZhcmkgaXNzdWUgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9wbGF5d3JpZ2h0L2lzc3Vlcy81ODk0XG4gICAgfVxuICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpXG5cbiAgICAvLyBGb3IgdGV4dCBjb250ZW50IHN3YXBzLCBkb24ndCBwYXJzZSB0aGUgcmVzcG9uc2UgYXMgSFRNTCwganVzdCBpbnNlcnQgaXRcbiAgICBpZiAoc3dhcFNwZWMuc3dhcFN0eWxlID09PSAndGV4dENvbnRlbnQnKSB7XG4gICAgICB0YXJnZXQudGV4dENvbnRlbnQgPSBjb250ZW50XG4gICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBmcmFnbWVudCBhbmQgcHJvY2VzcyBpdFxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY29udGVudClcblxuICAgICAgc2V0dGxlSW5mby50aXRsZSA9IGZyYWdtZW50LnRpdGxlXG5cbiAgICAgIC8vIHNlbGVjdC1vb2Igc3dhcHNcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3RPT0IpIHtcbiAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWVzID0gc3dhcE9wdGlvbnMuc2VsZWN0T09CLnNwbGl0KCcsJylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvb2JTZWxlY3RWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlc1tpXS5zcGxpdCgnOicsIDIpXG4gICAgICAgICAgbGV0IGlkID0gb29iU2VsZWN0VmFsdWVbMF0udHJpbSgpXG4gICAgICAgICAgaWYgKGlkLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcoMSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBvb2JTZWxlY3RWYWx1ZVsxXSB8fCAndHJ1ZSdcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignIycgKyBpZClcbiAgICAgICAgICBpZiAob29iRWxlbWVudCkge1xuICAgICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9vYiBzd2Fwc1xuICAgICAgZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ3RlbXBsYXRlJyksIC8qKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlICovZnVuY3Rpb24odGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGZpbmRBbmRTd2FwT29iRWxlbWVudHModGVtcGxhdGUuY29udGVudCwgc2V0dGxlSW5mbykpIHtcbiAgICAgICAgICAvLyBBdm9pZCBwb2xsdXRpbmcgdGhlIERPTSB3aXRoIGVtcHR5IHRlbXBsYXRlcyB0aGF0IHdlcmUgb25seSB1c2VkIHRvIGVuY2Fwc3VsYXRlIG9vYiBzd2FwXG4gICAgICAgICAgdGVtcGxhdGUucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gbm9ybWFsIHN3YXBcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3QpIHtcbiAgICAgICAgY29uc3QgbmV3RnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3dhcE9wdGlvbnMuc2VsZWN0KSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIG5ld0ZyYWdtZW50LmFwcGVuZENoaWxkKG5vZGUpXG4gICAgICAgIH0pXG4gICAgICAgIGZyYWdtZW50ID0gbmV3RnJhZ21lbnRcbiAgICAgIH1cbiAgICAgIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KVxuICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3BlYy5zd2FwU3R5bGUsIHN3YXBPcHRpb25zLmNvbnRleHRFbGVtZW50LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cblxuICAgIC8vIGFwcGx5IHNhdmVkIGZvY3VzIGFuZCBzZWxlY3Rpb24gaW5mb3JtYXRpb24gdG8gc3dhcHBlZCBjb250ZW50XG4gICAgaWYgKHNlbGVjdGlvbkluZm8uZWx0ICYmXG4gICAgICAhYm9keUNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZWx0KSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSkge1xuICAgICAgY29uc3QgbmV3QWN0aXZlRWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSlcbiAgICAgIGNvbnN0IGZvY3VzT3B0aW9ucyA9IHsgcHJldmVudFNjcm9sbDogc3dhcFNwZWMuZm9jdXNTY3JvbGwgIT09IHVuZGVmaW5lZCA/ICFzd2FwU3BlYy5mb2N1c1Njcm9sbCA6ICFodG14LmNvbmZpZy5kZWZhdWx0Rm9jdXNTY3JvbGwgfVxuICAgICAgaWYgKG5ld0FjdGl2ZUVsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChzZWxlY3Rpb25JbmZvLnN0YXJ0ICYmIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uSW5mby5zdGFydCwgc2VsZWN0aW9uSW5mby5lbmQpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdGhlIHNldFNlbGVjdGlvblJhbmdlIG1ldGhvZCBpcyBwcmVzZW50IG9uIGZpZWxkcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQsIHNvIGp1c3QgbGV0IHRoaXMgZmFpbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdBY3RpdmVFbHQuZm9jdXMoZm9jdXNPcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG4gICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU3dhcCcsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICB9KVxuICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaykge1xuICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2soKVxuICAgIH1cblxuICAgIC8vIG1lcmdlIGluIG5ldyB0aXRsZSBhZnRlciBzd2FwIGJ1dCBiZWZvcmUgc2V0dGxlXG4gICAgaWYgKCFzd2FwU3BlYy5pZ25vcmVUaXRsZSkge1xuICAgICAgaGFuZGxlVGl0bGUoc2V0dGxlSW5mby50aXRsZSlcbiAgICB9XG5cbiAgICAvLyBzZXR0bGVcbiAgICBjb25zdCBkb1NldHRsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLnRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgIHRhc2suY2FsbCgpXG4gICAgICB9KVxuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTZXR0bGUnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgICB9KVxuXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYW5jaG9yKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclRhcmdldCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KCcjJyArIHN3YXBPcHRpb25zLmFuY2hvcikpXG4gICAgICAgIGlmIChhbmNob3JUYXJnZXQpIHtcbiAgICAgICAgICBhbmNob3JUYXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6ICdhdXRvJyB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVNjcm9sbFN0YXRlKHNldHRsZUluZm8uZWx0cywgc3dhcFNwZWMpXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaykge1xuICAgICAgICBzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3dhcFNwZWMuc2V0dGxlRGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU2V0dGxlLCBzd2FwU3BlYy5zZXR0bGVEZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TZXR0bGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCBoZWFkZXIsIGVsdCkge1xuICAgIGNvbnN0IHRyaWdnZXJCb2R5ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlcilcbiAgICBpZiAodHJpZ2dlckJvZHkuaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICBjb25zdCB0cmlnZ2VycyA9IHBhcnNlSlNPTih0cmlnZ2VyQm9keSlcbiAgICAgIGZvciAoY29uc3QgZXZlbnROYW1lIGluIHRyaWdnZXJzKSB7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgICAgbGV0IGRldGFpbCA9IHRyaWdnZXJzW2V2ZW50TmFtZV1cbiAgICAgICAgICBpZiAoaXNSYXdPYmplY3QoZGV0YWlsKSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWx0ID0gZGV0YWlsLnRhcmdldCAhPT0gdW5kZWZpbmVkID8gZGV0YWlsLnRhcmdldCA6IGVsdFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRhaWwgPSB7IHZhbHVlOiBkZXRhaWwgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBldmVudE5hbWVzID0gdHJpZ2dlckJvZHkuc3BsaXQoJywnKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZXNbaV0udHJpbSgpLCBbXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBXSElURVNQQUNFID0gL1xccy9cbiAgY29uc3QgV0hJVEVTUEFDRV9PUl9DT01NQSA9IC9bXFxzLF0vXG4gIGNvbnN0IFNZTUJPTF9TVEFSVCA9IC9bXyRhLXpBLVpdL1xuICBjb25zdCBTWU1CT0xfQ09OVCA9IC9bXyRhLXpBLVowLTldL1xuICBjb25zdCBTVFJJTkdJU0hfU1RBUlQgPSBbJ1wiJywgXCInXCIsICcvJ11cbiAgY29uc3QgTk9UX1dISVRFU1BBQ0UgPSAvW15cXHNdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVCA9IC9beyhdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQgPSAvW30pXS9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZVN0cmluZyhzdHIpIHtcbiAgICAvKiogQHR5cGUgc3RyaW5nW10gKi9cbiAgICBjb25zdCB0b2tlbnMgPSBbXVxuICAgIGxldCBwb3NpdGlvbiA9IDBcbiAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoKSB7XG4gICAgICBpZiAoU1lNQk9MX1NUQVJULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbikpKSB7XG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgd2hpbGUgKFNZTUJPTF9DT05ULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbiArIDEpKSkge1xuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIGlmIChTVFJJTkdJU0hfU1RBUlQuaW5kZXhPZihzdHIuY2hhckF0KHBvc2l0aW9uKSkgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2hhciA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoICYmIHN0ci5jaGFyQXQocG9zaXRpb24pICE9PSBzdGFydENoYXIpIHtcbiAgICAgICAgICBpZiAoc3RyLmNoYXJBdChwb3NpdGlvbikgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHRva2Vucy5wdXNoKHN5bWJvbClcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9uKytcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBsYXN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkge1xuICAgIHJldHVybiBTWU1CT0xfU1RBUlQuZXhlYyh0b2tlbi5jaGFyQXQoMCkpICYmXG4gICAgICB0b2tlbiAhPT0gJ3RydWUnICYmXG4gICAgICB0b2tlbiAhPT0gJ2ZhbHNlJyAmJlxuICAgICAgdG9rZW4gIT09ICd0aGlzJyAmJlxuICAgICAgdG9rZW4gIT09IHBhcmFtTmFtZSAmJlxuICAgICAgbGFzdCAhPT0gJy4nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Q29uZGl0aW9uYWxGdW5jdGlvbnxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCBwYXJhbU5hbWUpIHtcbiAgICBpZiAodG9rZW5zWzBdID09PSAnWycpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICBsZXQgYnJhY2tldENvdW50ID0gMVxuICAgICAgbGV0IGNvbmRpdGlvbmFsU291cmNlID0gJyByZXR1cm4gKGZ1bmN0aW9uKCcgKyBwYXJhbU5hbWUgKyAnKXsgcmV0dXJuICgnXG4gICAgICBsZXQgbGFzdCA9IG51bGxcbiAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1swXVxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBzaGlmdCBjYWxsLCBhbmQgdGhpbmtzIHdlJ3JlIGNvbXBhcmluZyB0aGUgc2FtZSB2YWx1ZSBoZXJlLCBpLmUuICdbJyB2cyAnXSdcbiAgICAgICAgaWYgKHRva2VuID09PSAnXScpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQtLVxuICAgICAgICAgIGlmIChicmFja2V0Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChsYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyAndHJ1ZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKX0pJ1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uRnVuY3Rpb24gPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oY29uZGl0aW9uYWxTb3VyY2UpKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pXG4gICAgICAgICAgICAgIGNvbmRpdGlvbkZ1bmN0aW9uLnNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlXG4gICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25GdW5jdGlvblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnN5bnRheDplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZTogY29uZGl0aW9uYWxTb3VyY2UgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdbJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudCsrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSkge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcoKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpID8gKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpIDogKHdpbmRvdy4nICsgdG9rZW4gKyAnKSknXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArIHRva2VuXG4gICAgICAgIH1cbiAgICAgICAgbGFzdCA9IHRva2Vucy5zaGlmdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gbWF0Y2hcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbCh0b2tlbnMsIG1hdGNoKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmICFtYXRjaC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHJlc3VsdCArPSB0b2tlbnMuc2hpZnQoKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKSB7XG4gICAgbGV0IHJlc3VsdFxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMCAmJiBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQpLnRyaW0oKVxuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY29uc3QgSU5QVVRfU0VMRUNUT1IgPSAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBsaWNpdFRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIGZvciB0cmlnZ2VyIHNwZWNzXG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSkge1xuICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXSAqL1xuICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVTdHJpbmcoZXhwbGljaXRUcmlnZ2VyKVxuICAgIGRvIHtcbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IHRva2Vucy5sZW5ndGhcbiAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLylcbiAgICAgIGlmICh0cmlnZ2VyICE9PSAnJykge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2V2ZXJ5Jykge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCBldmVyeSA9IHsgdHJpZ2dlcjogJ2V2ZXJ5JyB9XG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgZXZlcnkucG9sbEludGVydmFsID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLykpXG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgZXZlcnkuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaChldmVyeSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgdHJpZ2dlclNwZWMgPSB7IHRyaWdnZXIgfVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXSAhPT0gJywnKSB7XG4gICAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gJ2NoYW5nZWQnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnb25jZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMub25jZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdjb25zdW1lJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jb25zdW1lID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2RlbGF5JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5kZWxheSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZnJvbScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgaWYgKENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgICAgICBpZiAoZnJvbV9hcmcgPT09ICdjbG9zZXN0JyB8fCBmcm9tX2FyZyA9PT0gJ2ZpbmQnIHx8IGZyb21fYXJnID09PSAnbmV4dCcgfHwgZnJvbV9hcmcgPT09ICdwcmV2aW91cycpIHtcbiAgICAgICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgICAgICAvLyBgbmV4dGAgYW5kIGBwcmV2aW91c2AgYWxsb3cgYSBzZWxlY3Rvci1sZXNzIHN5bnRheFxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbV9hcmcgKz0gJyAnICsgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZnJvbSA9IGZyb21fYXJnXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGFyZ2V0JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50YXJnZXQgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Rocm90dGxlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50aHJvdHRsZSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncXVldWUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnF1ZXVlID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdyb290JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RocmVzaG9sZCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2godHJpZ2dlclNwZWMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSBpbml0aWFsTGVuZ3RoKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgIH0gd2hpbGUgKHRva2Vuc1swXSA9PT0gJywnICYmIHRva2Vucy5zaGlmdCgpKVxuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSA9IHRyaWdnZXJTcGVjc1xuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VHJpZ2dlclNwZWNzKGVsdCkge1xuICAgIGNvbnN0IGV4cGxpY2l0VHJpZ2dlciA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRyaWdnZXInKVxuICAgIGxldCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGlmIChleHBsaWNpdFRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gaHRteC5jb25maWcudHJpZ2dlclNwZWNzQ2FjaGVcbiAgICAgIHRyaWdnZXJTcGVjcyA9IChjYWNoZSAmJiBjYWNoZVtleHBsaWNpdFRyaWdnZXJdKSB8fCBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpXG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJTcGVjcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdzdWJtaXQnIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJidXR0b25cIl0sIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCBJTlBVVF9TRUxFQ1RPUikpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2hhbmdlJyB9XVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gY2FuY2VsUG9sbGluZyhlbHQpIHtcbiAgICBnZXRJbnRlcm5hbERhdGEoZWx0KS5jYW5jZWxsZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gc3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIG5vZGVEYXRhLnRpbWVvdXQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGJvZHlDb250YWlucyhlbHQpICYmIG5vZGVEYXRhLmNhbmNlbGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQoc3BlYywgZWx0LCBtYWtlRXZlbnQoJ2h4OnBvbGw6dHJpZ2dlcicsIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlYzogc3BlYyxcbiAgICAgICAgICB0YXJnZXQ6IGVsdFxuICAgICAgICB9KSkpIHtcbiAgICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpXG4gICAgICB9XG4gICAgfSwgc3BlYy5wb2xsSW50ZXJ2YWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MQW5jaG9yRWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNMb2NhbExpbmsoZWx0KSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uLmhvc3RuYW1lID09PSBlbHQuaG9zdG5hbWUgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpICE9PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGVsdElzRGlzYWJsZWQoZWx0KSB7XG4gICAgcmV0dXJuIGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqL1xuICBmdW5jdGlvbiBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgaWYgKChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBpc0xvY2FsTGluayhlbHQpICYmIChlbHQudGFyZ2V0ID09PSAnJyB8fCBlbHQudGFyZ2V0ID09PSAnX3NlbGYnKSkgfHwgKGVsdC50YWdOYW1lID09PSAnRk9STScgJiYgU3RyaW5nKGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKSkudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpKSB7XG4gICAgICBub2RlRGF0YS5ib29zdGVkID0gdHJ1ZVxuICAgICAgbGV0IHZlcmIsIHBhdGhcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgIHZlcmIgPSAnZ2V0J1xuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3QXR0cmlidXRlID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpXG4gICAgICAgIHZlcmIgPSByYXdBdHRyaWJ1dGUgPyByYXdBdHRyaWJ1dGUudG9Mb3dlckNhc2UoKSA6ICdnZXQnXG4gICAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgICB9XG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnYWN0aW9uJylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgfSwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZENhbmNlbChldnQsIG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChldnQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZXZ0LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwic3VibWl0XCJdLCBidXR0b24nKSAmJiBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGVsdC5ocmVmICYmXG4gICAgICAgIChlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT09ICcjJyB8fCBlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykuaW5kZXhPZignIycpICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fE1vdXNlRXZlbnR8S2V5Ym9hcmRFdmVudHxUb3VjaEV2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZXZ0LnR5cGUgPT09ICdjbGljaycgJiZcbiAgICAgIC8vIEB0cy1pZ25vcmUgdGhpcyB3aWxsIHJlc29sdmUgdG8gdW5kZWZpbmVkIGZvciBldmVudHMgdGhhdCBkb24ndCBkZWZpbmUgdGhvc2UgcHJvcGVydGllcywgd2hpY2ggaXMgZmluZVxuICAgICAgKGV2dC5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkge1xuICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXJcbiAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEZpbHRlci5jYWxsKGVsdCwgZXZ0KSAhPT0gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmVudEZpbHRlci5zb3VyY2VcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpldmVudEZpbHRlcjplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtleHBsaWNpdENhbmNlbF1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIGV4cGxpY2l0Q2FuY2VsKSB7XG4gICAgY29uc3QgZWxlbWVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIC8qKiBAdHlwZSB7KE5vZGV8V2luZG93KVtdfSAqL1xuICAgIGxldCBlbHRzVG9MaXN0ZW5PblxuICAgIGlmICh0cmlnZ2VyU3BlYy5mcm9tKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCB0cmlnZ2VyU3BlYy5mcm9tKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IFtlbHRdXG4gICAgfVxuICAgIC8vIHN0b3JlIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMsIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXkgY2hhbmdlXG4gICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uLmZvckVhY2goZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgfSlcbiAgICB9XG4gICAgZm9yRWFjaChlbHRzVG9MaXN0ZW5PbiwgZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGVsdFRvTGlzdGVuT24ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBsaWNpdENhbmNlbCB8fCBzaG91bGRDYW5jZWwoZXZ0LCBlbHQpKSB7XG4gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2dClcbiAgICAgICAgZXZlbnREYXRhLnRyaWdnZXJTcGVjID0gdHJpZ2dlclNwZWNcbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yID09IG51bGwpIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvciA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yLmluZGV4T2YoZWx0KSA8IDApIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvci5wdXNoKGVsdClcbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY29uc3VtZSkge1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50YXJnZXQgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKGFzRWxlbWVudChldnQudGFyZ2V0KSwgdHJpZ2dlclNwZWMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLm9uY2UpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgICAgICAgaWYgKGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEuZGVsYXllZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVsZW1lbnREYXRhLmRlbGF5ZWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocm90dGxlID4gMCkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gbnVsbFxuICAgICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy50aHJvdHRsZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLmRlbGF5ID4gMCkge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZGVsYXllZCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub2RlRGF0YS5saXN0ZW5lckluZm9zID09IG51bGwpIHtcbiAgICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcyA9IFtdXG4gICAgICB9XG4gICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyU3BlYy50cmlnZ2VyLFxuICAgICAgICBsaXN0ZW5lcjogZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgb246IGVsdFRvTGlzdGVuT25cbiAgICAgIH0pXG4gICAgICBlbHRUb0xpc3Rlbk9uLmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICB9KVxuICB9XG5cbiAgbGV0IHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2UgLy8gdXNlZCBieSBpbml0U2Nyb2xsSGFuZGxlclxuICBsZXQgc2Nyb2xsSGFuZGxlciA9IG51bGxcbiAgZnVuY3Rpb24gaW5pdFNjcm9sbEhhbmRsZXIoKSB7XG4gICAgaWYgKCFzY3JvbGxIYW5kbGVyKSB7XG4gICAgICBzY3JvbGxIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgICAgfVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpXG4gICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHdpbmRvd0lzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgICAgICAgIGZvckVhY2goZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXIqPSdyZXZlYWxlZCddLFtkYXRhLWh4LXRyaWdnZXIqPSdyZXZlYWxlZCddXCIpLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIG1heWJlUmV2ZWFsKGVsdClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVJldmVhbChlbHQpIHtcbiAgICBpZiAoIWhhc0F0dHJpYnV0ZShlbHQsICdkYXRhLWh4LXJldmVhbGVkJykgJiYgaXNTY3JvbGxlZEludG9WaWV3KGVsdCkpIHtcbiAgICAgIGVsdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaHgtcmV2ZWFsZWQnLCAndHJ1ZScpXG4gICAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAobm9kZURhdGEuaW5pdEhhc2gpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZSBub2RlIGlzbid0IGluaXRpYWxpemVkLCB3YWl0IGZvciBpdCBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgcmVxdWVzdFxuICAgICAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphZnRlclByb2Nlc3NOb2RlJywgZnVuY3Rpb24oKSB7IHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpIH0sIHsgb25jZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5XG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSW1tZWRpYXRlbHkoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgZGVsYXkpIHtcbiAgICBjb25zdCBsb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW5vZGVEYXRhLmxvYWRlZCkge1xuICAgICAgICBub2RlRGF0YS5sb2FkZWQgPSB0cnVlXG4gICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGxvYWQsIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGxldCBleHBsaWNpdEFjdGlvbiA9IGZhbHNlXG4gICAgZm9yRWFjaChWRVJCUywgZnVuY3Rpb24odmVyYikge1xuICAgICAgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC0nICsgdmVyYikpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LScgKyB2ZXJiKVxuICAgICAgICBleHBsaWNpdEFjdGlvbiA9IHRydWVcbiAgICAgICAgbm9kZURhdGEucGF0aCA9IHBhdGhcbiAgICAgICAgbm9kZURhdGEudmVyYiA9IHZlcmJcbiAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGV4cGxpY2l0QWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQGNhbGxiYWNrIFRyaWdnZXJIYW5kbGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IFtldnRdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKi9cbiAgZnVuY3Rpb24gYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGhhbmRsZXIpIHtcbiAgICBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ3JldmVhbGVkJykge1xuICAgICAgaW5pdFNjcm9sbEhhbmRsZXIoKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICAgIG1heWJlUmV2ZWFsKGFzRWxlbWVudChlbHQpKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2ludGVyc2VjdCcpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyT3B0aW9ucyA9IHt9XG4gICAgICBpZiAodHJpZ2dlclNwZWMucm9vdCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMucm9vdCA9IHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0cmlnZ2VyU3BlYy5yb290KVxuICAgICAgfVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocmVzaG9sZCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMudGhyZXNob2xkID0gcGFyc2VGbG9hdCh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpXG4gICAgICB9XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlbnRyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXVxuICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2ludGVyc2VjdCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgb2JzZXJ2ZXJPcHRpb25zKVxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShhc0VsZW1lbnQoZWx0KSlcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdsb2FkJykge1xuICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIG1ha2VFdmVudCgnbG9hZCcsIHsgZWx0IH0pKSkge1xuICAgICAgICBsb2FkSW1tZWRpYXRlbHkoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnBvbGxJbnRlcnZhbCA+IDApIHtcbiAgICAgIG5vZGVEYXRhLnBvbGxpbmcgPSB0cnVlXG4gICAgICBwcm9jZXNzUG9sbGluZyhhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3NIeE9uKG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbHQuYXR0cmlidXRlc1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdLm5hbWVcbiAgICAgIGlmIChzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb246JykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb246JykgfHxcbiAgICAgICAgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uLScpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uLScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBjb25zdCBIWF9PTl9RVUVSWSA9IG5ldyBYUGF0aEV2YWx1YXRvcigpXG4gICAgLmNyZWF0ZUV4cHJlc3Npb24oJy4vLypbQCpbIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbjpcIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb246XCIpIG9yJyArXG4gICAgICAnIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbi1cIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb24tXCIpIF1dJylcblxuICBmdW5jdGlvbiBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cykge1xuICAgIGlmIChzaG91bGRQcm9jZXNzSHhPbihlbHQpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChlbHQpKVxuICAgIH1cbiAgICBjb25zdCBpdGVyID0gSFhfT05fUVVFUlkuZXZhbHVhdGUoZWx0KVxuICAgIGxldCBub2RlID0gbnVsbFxuICAgIHdoaWxlIChub2RlID0gaXRlci5pdGVyYXRlTmV4dCgpKSBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChub2RlKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpIHtcbiAgICAvKiogQHR5cGUge0VsZW1lbnRbXX0gKi9cbiAgICBjb25zdCBlbGVtZW50cyA9IFtdXG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWx0LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgcHJvY2Vzc0hYT25Sb290KGNoaWxkLCBlbGVtZW50cylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpXG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCkge1xuICAgIGlmIChlbHQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgY29uc3QgYm9vc3RlZFNlbGVjdG9yID0gJywgW2h4LWJvb3N0XSBhLCBbZGF0YS1oeC1ib29zdF0gYSwgYVtoeC1ib29zdF0sIGFbZGF0YS1oeC1ib29zdF0nXG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvblNlbGVjdG9ycyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGUgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2VdXG4gICAgICAgIGlmIChleHRlbnNpb24uZ2V0U2VsZWN0b3JzKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMoKVxuICAgICAgICAgIGlmIChzZWxlY3RvcnMpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvblNlbGVjdG9ycy5wdXNoKHNlbGVjdG9ycylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGVsdC5xdWVyeVNlbGVjdG9yQWxsKFZFUkJfU0VMRUNUT1IgKyBib29zdGVkU2VsZWN0b3IgKyBcIiwgZm9ybSwgW3R5cGU9J3N1Ym1pdCddLFwiICtcbiAgICAgICAgJyBbaHgtZXh0XSwgW2RhdGEtaHgtZXh0XSwgW2h4LXRyaWdnZXJdLCBbZGF0YS1oeC10cmlnZ2VyXScgKyBleHRlbnNpb25TZWxlY3RvcnMuZmxhdCgpLm1hcChzID0+ICcsICcgKyBzKS5qb2luKCcnKSlcblxuICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICogc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gKi8gKGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIikpXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBlbHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIilcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGZvcm0gPSByZXNvbHZlVGFyZ2V0KCcjJyArIGdldFJhd0F0dHJpYnV0ZShlbHQsICdmb3JtJyksIGVsdC5nZXRSb290Tm9kZSgpKSB8fCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKVxuICAgIGlmICghZm9ybSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXRCdXR0b25UcmFja2luZyhlbHQpIHtcbiAgICAvLyBuZWVkIHRvIGhhbmRsZSBib3RoIGNsaWNrIGFuZCBmb2N1cyBpbjpcbiAgICAvLyAgIGZvY3VzaW4gLSBpbiBjYXNlIHNvbWVvbmUgdGFicyBpbiB0byBhIGJ1dHRvbiBhbmQgaGl0cyB0aGUgc3BhY2UgYmFyXG4gICAgLy8gICBjbGljayAtIG9uIE9TWCBidXR0b25zIGRvIG5vdCBmb2N1cyBvbiBjbGljayBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzI0XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGVcbiAgICovXG4gIGZ1bmN0aW9uIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIGNvZGUpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGVEYXRhLm9uSGFuZGxlcnMpKSB7XG4gICAgICBub2RlRGF0YS5vbkhhbmRsZXJzID0gW11cbiAgICB9XG4gICAgbGV0IGZ1bmNcbiAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICBmdW5jID0gbmV3IEZ1bmN0aW9uKCdldmVudCcsIGNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgZnVuYy5jYWxsKGVsdCwgZSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgbm9kZURhdGEub25IYW5kbGVycy5wdXNoKHsgZXZlbnQ6IGV2ZW50TmFtZSwgbGlzdGVuZXIgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0h4T25XaWxkY2FyZChlbHQpIHtcbiAgICAvLyB3aXBlIGFueSBwcmV2aW91cyBvbiBoYW5kbGVycyBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMgcHJlY2VkZW5jZVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWx0KVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGNvbnN0IHZhbHVlID0gZWx0LmF0dHJpYnV0ZXNbaV0udmFsdWVcbiAgICAgIGlmIChzdGFydHNXaXRoKG5hbWUsICdoeC1vbicpIHx8IHN0YXJ0c1dpdGgobmFtZSwgJ2RhdGEtaHgtb24nKSkge1xuICAgICAgICBjb25zdCBhZnRlck9uUG9zaXRpb24gPSBuYW1lLmluZGV4T2YoJy1vbicpICsgM1xuICAgICAgICBjb25zdCBuZXh0Q2hhciA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uLCBhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICBpZiAobmV4dENoYXIgPT09ICctJyB8fCBuZXh0Q2hhciA9PT0gJzonKSB7XG4gICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgICAvLyBpZiB0aGUgZXZlbnROYW1lIHN0YXJ0cyB3aXRoIGEgY29sb24gb3IgZGFzaCwgcHJlcGVuZCBcImh0bXhcIiBmb3Igc2hvcnRoYW5kIHN1cHBvcnRcbiAgICAgICAgICBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICc6JykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14JyArIGV2ZW50TmFtZVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICctJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoMSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnaHRteC0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSg1KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXROb2RlKGVsdCkge1xuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAobm9kZURhdGEuaW5pdEhhc2ggIT09IGF0dHJpYnV0ZUhhc2goZWx0KSkge1xuICAgICAgLy8gY2xlYW4gdXAgYW55IHByZXZpb3VzbHkgcHJvY2Vzc2VkIGluZm9cbiAgICAgIGRlSW5pdE5vZGUoZWx0KVxuXG4gICAgICBub2RlRGF0YS5pbml0SGFzaCA9IGF0dHJpYnV0ZUhhc2goZWx0KVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpXG5cbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgaWYgKGVsdC52YWx1ZSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG5vZGVEYXRhLmxhc3RWYWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBnZXRUcmlnZ2VyU3BlY3MoZWx0KVxuICAgICAgY29uc3QgaGFzRXhwbGljaXRIdHRwQWN0aW9uID0gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcblxuICAgICAgaWYgKCFoYXNFeHBsaWNpdEh0dHBBY3Rpb24pIHtcbiAgICAgICAgaWYgKGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1ib29zdCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuICAgICAgICB9IGVsc2UgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC10cmlnZ2VyJykpIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgICAgLy8gRm9yIFwibmFrZWRcIiB0cmlnZ2VycywgZG9uJ3QgZG8gYW55dGhpbmcgYXQgYWxsXG4gICAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nIHx8IChnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JyAmJiBoYXNBdHRyaWJ1dGUoZWx0LCAnZm9ybScpKSkge1xuICAgICAgICBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclByb2Nlc3NOb2RlJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIG5ldyBjb250ZW50LCBlbmFibGluZyBodG14IGJlaGF2aW9yLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgY29udGVudCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBET00gb3V0c2lkZSBvZiB0aGUgbm9ybWFsIGh0bXggcmVxdWVzdCBjeWNsZSBidXQgc3RpbGwgd2FudCBodG14IGF0dHJpYnV0ZXMgdG8gd29yay5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcHJvY2Vzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgZWxlbWVudCB0byBwcm9jZXNzXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShlbHQpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpbml0Tm9kZShlbHQpXG4gICAgZm9yRWFjaChmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSwgZnVuY3Rpb24oY2hpbGQpIHsgaW5pdE5vZGUoY2hpbGQpIH0pXG4gICAgZm9yRWFjaChmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSwgcHJvY2Vzc0h4T25XaWxkY2FyZClcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV2ZW50L0xvZyBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRldGFpbFxuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgLy8gVGhpcyBicmVha3MgZXhwZWN0ZWQgZW5jYXBzdWxhdGlvbiBidXQgbmVlZHMgdG8gYmUgaGVyZSB1bnRpbCBkZWNpZGVkIG90aGVyd2lzZSBieSBjb3JlIGRldnNcbiAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBldnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsXG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXJyb3JFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZXZlbnROYW1lIH0sIGRldGFpbCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpIHtcbiAgICByZXR1cm4gZXZlbnROYW1lID09PSAnaHRteDphZnRlclByb2Nlc3NOb2RlJ1xuICB9XG5cbiAgLyoqXG4gICAqIGB3aXRoRXh0ZW5zaW9uc2AgbG9jYXRlcyBhbGwgYWN0aXZlIGV4dGVuc2lvbnMgZm9yIGEgcHJvdmlkZWQgZWxlbWVudCwgdGhlblxuICAgKiBleGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdXNpbmcgZWFjaCBvZiB0aGUgYWN0aXZlIGV4dGVuc2lvbnMuICBJdCBzaG91bGRcbiAgICogYmUgY2FsbGVkIGludGVybmFsbHkgYXQgZXZlcnkgZXh0ZW5kYWJsZSBleGVjdXRpb24gcG9pbnQgaW4gaHRteC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHsoZXh0ZW5zaW9uOkh0bXhFeHRlbnNpb24pID0+IHZvaWR9IHRvRG9cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aEV4dGVuc2lvbnMoZWx0LCB0b0RvKSB7XG4gICAgZm9yRWFjaChnZXRFeHRlbnNpb25zKGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9EbyhleHRlbnNpb24pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ0Vycm9yKG1zZykge1xuICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1zZylcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICBjb25zb2xlLmxvZygnRVJST1I6ICcsIG1zZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBnaXZlbiBldmVudCBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RyaWdnZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byB0cmlnZ2VyXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsIGRldGFpbHMgZm9yIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRldGFpbCA9PSBudWxsKSB7XG4gICAgICBkZXRhaWwgPSB7fVxuICAgIH1cbiAgICBkZXRhaWwuZWx0ID0gZWx0XG4gICAgY29uc3QgZXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgaWYgKGh0bXgubG9nZ2VyICYmICFpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSkge1xuICAgICAgaHRteC5sb2dnZXIoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICB9XG4gICAgaWYgKGRldGFpbC5lcnJvcikge1xuICAgICAgbG9nRXJyb3IoZGV0YWlsLmVycm9yKVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6ZXJyb3InLCB7IGVycm9ySW5mbzogZGV0YWlsIH0pXG4gICAgfVxuICAgIGxldCBldmVudFJlc3VsdCA9IGVsdC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGtlYmFiTmFtZSA9IGtlYmFiRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAgICBpZiAoZXZlbnRSZXN1bHQgJiYga2ViYWJOYW1lICE9PSBldmVudE5hbWUpIHtcbiAgICAgIGNvbnN0IGtlYmFiZWRFdmVudCA9IG1ha2VFdmVudChrZWJhYk5hbWUsIGV2ZW50LmRldGFpbClcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgZWx0LmRpc3BhdGNoRXZlbnQoa2ViYWJlZEV2ZW50KVxuICAgIH1cbiAgICB3aXRoRXh0ZW5zaW9ucyhhc0VsZW1lbnQoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIChleHRlbnNpb24ub25FdmVudChldmVudE5hbWUsIGV2ZW50KSAhPT0gZmFsc2UgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgfSlcbiAgICByZXR1cm4gZXZlbnRSZXN1bHRcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhpc3RvcnkgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsZXQgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAvKipcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRIaXN0b3J5RWxlbWVudCgpIHtcbiAgICBjb25zdCBoaXN0b3J5RWx0ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpXG4gICAgcmV0dXJuIGhpc3RvcnlFbHQgfHwgZ2V0RG9jdW1lbnQoKS5ib2R5XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbHRcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVUb0hpc3RvcnlDYWNoZSh1cmwsIHJvb3RFbHQpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgc3RhdGUgdG8gc2F2ZVxuICAgIGNvbnN0IGlubmVySFRNTCA9IGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShyb290RWx0KVxuICAgIGNvbnN0IHRpdGxlID0gZ2V0RG9jdW1lbnQoKS50aXRsZVxuICAgIGNvbnN0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSA8PSAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbiBldmVudHVhbGx5IGFscmVhZHkgZXhpc3RpbmcgY2FjaGUgaXMgcHVyZ2VkXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICBoaXN0b3J5Q2FjaGUuc3BsaWNlKGksIDEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIEh0bXhIaXN0b3J5SXRlbSAqL1xuICAgIGNvbnN0IG5ld0hpc3RvcnlJdGVtID0geyB1cmwsIGNvbnRlbnQ6IGlubmVySFRNTCwgdGl0bGUsIHNjcm9sbCB9XG5cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5SXRlbUNyZWF0ZWQnLCB7IGl0ZW06IG5ld0hpc3RvcnlJdGVtLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG5cbiAgICBoaXN0b3J5Q2FjaGUucHVzaChuZXdIaXN0b3J5SXRlbSlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUpIHtcbiAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpXG4gICAgfVxuXG4gICAgLy8ga2VlcCB0cnlpbmcgdG8gc2F2ZSB0aGUgY2FjaGUgdW50aWwgaXQgc3VjY2VlZHMgb3IgaXMgZW1wdHlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5Q2FjaGUpKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZUVycm9yJywgeyBjYXVzZTogZSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuICAgICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKSAvLyBzaHJpbmsgdGhlIGNhY2hlIGFuZCByZXRyeVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeUl0ZW1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNjcm9sbFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcmV0dXJucyB7SHRteEhpc3RvcnlJdGVtfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDYWNoZWRIaXN0b3J5KHVybCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIHJldHVybiBoaXN0b3J5Q2FjaGVbaV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KGVsdCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGh0bXguY29uZmlnLnJlcXVlc3RDbGFzc1xuICAgIGNvbnN0IGNsb25lID0gLyoqIEB0eXBlIEVsZW1lbnQgKi8gKGVsdC5jbG9uZU5vZGUodHJ1ZSkpXG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnLicgKyBjbGFzc05hbWUpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhc3NOYW1lKVxuICAgIH0pXG4gICAgLy8gcmVtb3ZlIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgZm9yIGFueSBlbGVtZW50IGRpc2FibGVkIGR1ZSB0byBhbiBodG14IHJlcXVlc3RcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICdbZGF0YS1kaXNhYmxlZC1ieS1odG14XScpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgfSlcbiAgICByZXR1cm4gY2xvbmUuaW5uZXJIVE1MXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKSB7XG4gICAgY29uc3QgZWx0ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50UGF0aEZvckhpc3RvcnkgfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAgIC8vIEFsbG93IGhpc3Rvcnkgc25hcHNob3QgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCB3aGVyZSBoeC1oaXN0b3J5PVwiZmFsc2VcIlxuICAgIC8vIGlzIHByZXNlbnQgKmFueXdoZXJlKiBpbiB0aGUgY3VycmVudCBkb2N1bWVudCB3ZSdyZSBhYm91dCB0byBzYXZlLFxuICAgIC8vIHNvIHdlIGNhbiBwcmV2ZW50IHByaXZpbGVnZWQgZGF0YSBlbnRlcmluZyB0aGUgY2FjaGUuXG4gICAgLy8gVGhlIHBhZ2Ugd2lsbCBzdGlsbCBiZSByZWFjaGFibGUgYXMgYSBoaXN0b3J5IGVudHJ5LCBidXQgaHRteCB3aWxsIGZldGNoIGl0XG4gICAgLy8gbGl2ZSBmcm9tIHRoZSBzZXJ2ZXIgb25wb3BzdGF0ZSByYXRoZXIgdGhhbiBsb29rIGluIHRoZSBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICBsZXQgZGlzYWJsZUhpc3RvcnlDYWNoZVxuICAgIHRyeSB7XG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0nKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJRTExOiBpbnNlbnNpdGl2ZSBtb2RpZmllciBub3Qgc3VwcG9ydGVkIHNvIGZhbGxiYWNrIHRvIGNhc2Ugc2Vuc2l0aXZlIHNlbGVjdG9yXG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCJdLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiXScpXG4gICAgfVxuICAgIGlmICghZGlzYWJsZUhpc3RvcnlDYWNoZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVNhdmUnLCB7IHBhdGgsIGhpc3RvcnlFbHQ6IGVsdCB9KVxuICAgICAgc2F2ZVRvSGlzdG9yeUNhY2hlKHBhdGgsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCBnZXREb2N1bWVudCgpLnRpdGxlLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcHVzaFVybEludG9IaXN0b3J5KHBhdGgpIHtcbiAgLy8gcmVtb3ZlIHRoZSBjYWNoZSBidXN0ZXIgcGFyYW1ldGVyLCBpZiBhbnlcbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvb3JnXFwuaHRteFxcLmNhY2hlLWJ1c3Rlcj1bXiZdKiY/LywgJycpXG4gICAgICBpZiAoZW5kc1dpdGgocGF0aCwgJyYnKSB8fCBlbmRzV2l0aChwYXRoLCAnPycpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIHtcbiAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICB9XG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlVXJsSW5IaXN0b3J5KHBhdGgpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0dGxlSW1tZWRpYXRlbHkodGFza3MpIHtcbiAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICB0YXNrLmNhbGwodW5kZWZpbmVkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgY29uc3QgZGV0YWlscyA9IHsgcGF0aCwgeGhyOiByZXF1ZXN0IH1cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzJywgZGV0YWlscylcbiAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1DdXJyZW50LVVSTCcsIGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZilcbiAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZCcsIGRldGFpbHMpXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KHRoaXMucmVzcG9uc2UpXG4gICAgICAgIC8qKiBAdHlwZSBQYXJlbnROb2RlICovXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpIHx8IGZyYWdtZW50XG4gICAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuXG4gICAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGNvbnRlbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGNhY2hlTWlzczogdHJ1ZSwgc2VydmVyUmVzcG9uc2U6IHRoaXMucmVzcG9uc2UgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWRFcnJvcicsIGRldGFpbHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3Quc2VuZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzdG9yZUhpc3RvcnkocGF0aCkge1xuICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgcGF0aCA9IHBhdGggfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRIaXN0b3J5KHBhdGgpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY2FjaGVkLmNvbnRlbnQpXG4gICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGNhY2hlZC5zY3JvbGwpXG4gICAgICB9LCAwKSAvLyBuZXh0ICd0aWNrJywgc28gYnJvd3NlciBoYXMgdGltZSB0byByZW5kZXIgbGF5b3V0XG4gICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgaXRlbTogY2FjaGVkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5yZWZyZXNoT25IaXN0b3J5TWlzcykge1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gcmVsb2FkKCkgZnVuY3Rpb24gdGhyb3dzIGVycm9yXG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpIHtcbiAgICBsZXQgaW5kaWNhdG9ycyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluZGljYXRvcicpKVxuICAgIGlmIChpbmRpY2F0b3JzID09IG51bGwpIHtcbiAgICAgIGluZGljYXRvcnMgPSBbZWx0XVxuICAgIH1cbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBpYy5jbGFzc0xpc3QuYWRkLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgfSlcbiAgICByZXR1cm4gaW5kaWNhdG9yc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBkaXNhYmxlRWxlbWVudHMoZWx0KSB7XG4gICAgbGV0IGRpc2FibGVkRWx0cyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWRpc2FibGVkLWVsdCcpKVxuICAgIGlmIChkaXNhYmxlZEVsdHMgPT0gbnVsbCkge1xuICAgICAgZGlzYWJsZWRFbHRzID0gW11cbiAgICB9XG4gICAgZm9yRWFjaChkaXNhYmxlZEVsdHMsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnLCAnJylcbiAgICB9KVxuICAgIHJldHVybiBkaXNhYmxlZEVsdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gaW5kaWNhdG9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVkKSB7XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgaWMuY2xhc3NMaXN0LnJlbW92ZS5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChkaXNhYmxlZCwgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnB1dCBWYWx1ZSBQcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IHByb2Nlc3NlZFtpXVxuICAgICAgaWYgKG5vZGUuaXNTYW1lTm9kZShlbHQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkSW5jbHVkZShlbGVtZW50KSB7XG4gICAgLy8gQ2FzdCB0byB0cmljayB0c2MsIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCB3b3JrIGZpbmUgaGVyZVxuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudH0gKi8gKGVsZW1lbnQpXG4gICAgaWYgKGVsdC5uYW1lID09PSAnJyB8fCBlbHQubmFtZSA9PSBudWxsIHx8IGVsdC5kaXNhYmxlZCB8fCBjbG9zZXN0KGVsdCwgJ2ZpZWxkc2V0W2Rpc2FibGVkXScpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgLy8gaWdub3JlIFwic3VibWl0dGVyXCIgdHlwZXMgKHNlZSBqUXVlcnkgc3JjL3NlcmlhbGl6ZS5qcylcbiAgICBpZiAoZWx0LnR5cGUgPT09ICdidXR0b24nIHx8IGVsdC50eXBlID09PSAnc3VibWl0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ltYWdlJyB8fCBlbHQudGFnTmFtZSA9PT0gJ3Jlc2V0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGVsdC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsdC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm4gZWx0LmNoZWNrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheXxGb3JtRGF0YUVudHJ5VmFsdWV9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxldCB2YWx1ZXMgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdmFsdWUuaW5kZXhPZih2KSA8IDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpXG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgIGZvckVhY2godmFsdWVzLCB2ID0+IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudHxIVE1MU2VsZWN0RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpIHtcbiAgICBpZiAoZWx0ID09IG51bGwgfHwgaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NlZC5wdXNoKGVsdClcbiAgICB9XG4gICAgaWYgKHNob3VsZEluY2x1ZGUoZWx0KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJylcbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgbGV0IHZhbHVlID0gZWx0LnZhbHVlXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgZWx0Lm11bHRpcGxlKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uOmNoZWNrZWQnKSkubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuICgvKiogQHR5cGUgSFRNTE9wdGlvbkVsZW1lbnQgKi8oZSkpLnZhbHVlIH0pXG4gICAgICB9XG4gICAgICAvLyBpbmNsdWRlIGZpbGUgaW5wdXRzXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbHQuZmlsZXMpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5maWxlcylcbiAgICAgIH1cbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGVsdC5lbGVtZW50cywgZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHByb2Nlc3NlZC5pbmRleE9mKGlucHV0KSA+PSAwKSB7XG4gICAgICAgICAgLy8gVGhlIGlucHV0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZCBhZGRlZCB0byB0aGUgdmFsdWVzLCBidXQgdGhlIEZvcm1EYXRhIHRoYXQgd2lsbCBiZVxuICAgICAgICAgIC8vICBjb25zdHJ1Y3RlZCByaWdodCBhZnRlciBvbiB0aGUgZm9ybSwgd2lsbCBpbmNsdWRlIGl0IG9uY2UgYWdhaW4uIFNvIHJlbW92ZSB0aGF0IGlucHV0J3MgdmFsdWVcbiAgICAgICAgICAvLyAgbm93IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShpbnB1dC5uYW1lLCBpbnB1dC52YWx1ZSwgZm9ybURhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1c2goaW5wdXQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgICAgdmFsaWRhdGVFbGVtZW50KGlucHV0LCBlcnJvcnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBuZXcgRm9ybURhdGEoZWx0KS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgJiYgdmFsdWUubmFtZSA9PT0gJycpIHtcbiAgICAgICAgICByZXR1cm4gLy8gaWdub3JlIG5vLW5hbWUgZmlsZXNcbiAgICAgICAgfVxuICAgICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICovXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50ICYgRWxlbWVudEludGVybmFsc30gKi8gKGVsdClcbiAgICBpZiAoZWxlbWVudC53aWxsVmFsaWRhdGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOnZhbGlkYXRlJylcbiAgICAgIGlmICghZWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBlbHQ6IGVsZW1lbnQsIG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOmZhaWxlZCcsIHsgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBvbmUgRm9ybURhdGEgd2l0aCB0aG9zZSBmcm9tIGFub3RoZXIuXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IHJlY2VpdmVyIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBkb25vciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIG92ZXJyaWRpbmcgdmFsdWVzXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX0gdGhlIHtAbGlua2NvZGUgcmVjZWl2ZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvdmVycmlkZUZvcm1EYXRhKHJlY2VpdmVyLCBkb25vcikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGRvbm9yLmtleXMoKSkge1xuICAgICAgcmVjZWl2ZXIuZGVsZXRlKGtleSlcbiAgICB9XG4gICAgZG9ub3IuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZWNlaXZlci5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZWNlaXZlclxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEByZXR1cm5zIHt7ZXJyb3JzOiBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdLCBmb3JtRGF0YTogRm9ybURhdGEsIHZhbHVlczogT2JqZWN0fX1cbiAqL1xuICBmdW5jdGlvbiBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpIHtcbiAgICAvKiogQHR5cGUgRWxlbWVudFtdICovXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gW11cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgY29uc3QgcHJpb3JpdHlGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgLyoqIEB0eXBlIEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCAmJiAhYm9keUNvbnRhaW5zKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBvbmx5IHZhbGlkYXRlIHdoZW4gZm9ybSBpcyBkaXJlY3RseSBzdWJtaXR0ZWQgYW5kIG5vdmFsaWRhdGUgb3IgZm9ybW5vdmFsaWRhdGUgYXJlIG5vdCBzZXRcbiAgICAvLyBvciBpZiB0aGUgZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgaHgtdmFsaWRhdGU9XCJ0cnVlXCIgb24gaXRcbiAgICBsZXQgdmFsaWRhdGUgPSAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmIGVsdC5ub1ZhbGlkYXRlICE9PSB0cnVlKSB8fCBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC12YWxpZGF0ZScpID09PSAndHJ1ZSdcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSB7XG4gICAgICB2YWxpZGF0ZSA9IHZhbGlkYXRlICYmIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZC5mb3JtTm9WYWxpZGF0ZSAhPT0gdHJ1ZVxuICAgIH1cblxuICAgIC8vIGZvciBhIG5vbi1HRVQgaW5jbHVkZSB0aGUgY2xvc2VzdCBmb3JtXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIHByaW9yaXR5Rm9ybURhdGEsIGVycm9ycywgY2xvc2VzdChlbHQsICdmb3JtJyksIHZhbGlkYXRlKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKVxuXG4gICAgLy8gaWYgYSBidXR0b24gb3Igc3VibWl0IHdhcyBjbGlja2VkIGxhc3QsIGluY2x1ZGUgaXRzIHZhbHVlXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCBlbHQudGFnTmFtZSA9PT0gJ0JVVFRPTicgfHxcbiAgICAoZWx0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcpKSB7XG4gICAgICBjb25zdCBidXR0b24gPSBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgKC8qKiBAdHlwZSBIVE1MSW5wdXRFbGVtZW50fEhUTUxCdXR0b25FbGVtZW50ICovKGVsdCkpXG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGJ1dHRvbiwgJ25hbWUnKVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIGJ1dHRvbi52YWx1ZSwgcHJpb3JpdHlGb3JtRGF0YSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIGFueSBleHBsaWNpdCBpbmNsdWRlc1xuICAgIGNvbnN0IGluY2x1ZGVzID0gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5jbHVkZScpXG4gICAgZm9yRWFjaChpbmNsdWRlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBhc0VsZW1lbnQobm9kZSksIHZhbGlkYXRlKVxuICAgICAgLy8gaWYgYSBub24tZm9ybSBpcyBpbmNsdWRlZCwgaW5jbHVkZSBhbnkgaW5wdXQgdmFsdWVzIHdpdGhpbiBpdFxuICAgICAgaWYgKCFtYXRjaGVzKG5vZGUsICdmb3JtJykpIHtcbiAgICAgICAgZm9yRWFjaChhc1BhcmVudE5vZGUobm9kZSkucXVlcnlTZWxlY3RvckFsbChJTlBVVF9TRUxFQ1RPUiksIGZ1bmN0aW9uKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGRlc2NlbmRhbnQsIHZhbGlkYXRlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyB2YWx1ZXMgZnJvbSBhIDxmb3JtPiB0YWtlIHByZWNlZGVuY2UsIG92ZXJyaWRpbmcgdGhlIHJlZ3VsYXIgdmFsdWVzXG4gICAgb3ZlcnJpZGVGb3JtRGF0YShmb3JtRGF0YSwgcHJpb3JpdHlGb3JtRGF0YSlcblxuICAgIHJldHVybiB7IGVycm9ycywgZm9ybURhdGEsIHZhbHVlczogZm9ybURhdGFQcm94eShmb3JtRGF0YSkgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXR1cm5TdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHthbnl9IHJlYWxWYWx1ZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBuYW1lLCByZWFsVmFsdWUpIHtcbiAgICBpZiAocmV0dXJuU3RyICE9PSAnJykge1xuICAgICAgcmV0dXJuU3RyICs9ICcmJ1xuICAgIH1cbiAgICBpZiAoU3RyaW5nKHJlYWxWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZWFsVmFsdWUgPSBKU09OLnN0cmluZ2lmeShyZWFsVmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IHMgPSBlbmNvZGVVUklDb21wb25lbnQocmVhbFZhbHVlKVxuICAgIHJldHVyblN0ciArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBzXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF8T2JqZWN0fSB2YWx1ZXNcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBmdW5jdGlvbiB1cmxFbmNvZGUodmFsdWVzKSB7XG4gICAgdmFsdWVzID0gZm9ybURhdGFGcm9tT2JqZWN0KHZhbHVlcylcbiAgICBsZXQgcmV0dXJuU3RyID0gJydcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm5TdHIgPSBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBamF4XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9tcHRcbiAqIEByZXR1cm5zIHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHQpIHtcbiAgICAvKiogQHR5cGUgSHRteEhlYWRlclNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgJ0hYLVJlcXVlc3QnOiAndHJ1ZScsXG4gICAgICAnSFgtVHJpZ2dlcic6IGdldFJhd0F0dHJpYnV0ZShlbHQsICdpZCcpLFxuICAgICAgJ0hYLVRyaWdnZXItTmFtZSc6IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJyksXG4gICAgICAnSFgtVGFyZ2V0JzogZ2V0QXR0cmlidXRlVmFsdWUodGFyZ2V0LCAnaWQnKSxcbiAgICAgICdIWC1DdXJyZW50LVVSTCc6IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cbiAgICBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LWhlYWRlcnMnLCBmYWxzZSwgaGVhZGVycylcbiAgICBpZiAocHJvbXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLVByb21wdCddID0gcHJvbXB0XG4gICAgfVxuICAgIGlmIChnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Cb29zdGVkJ10gPSAndHJ1ZSdcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIC8qKlxuICogZmlsdGVyVmFsdWVzIHRha2VzIGFuIG9iamVjdCBjb250YWluaW5nIGZvcm0gaW5wdXQgdmFsdWVzXG4gKiBhbmQgcmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBvbmx5IGNvbnRhaW5zIGtleXMgdGhhdCBhcmVcbiAqIHNwZWNpZmllZCBieSB0aGUgY2xvc2VzdCBcImh4LXBhcmFtc1wiIGF0dHJpYnV0ZVxuICogQHBhcmFtIHtGb3JtRGF0YX0gaW5wdXRWYWx1ZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZmlsdGVyVmFsdWVzKGlucHV0VmFsdWVzLCBlbHQpIHtcbiAgICBjb25zdCBwYXJhbXNWYWx1ZSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wYXJhbXMnKVxuICAgIGlmIChwYXJhbXNWYWx1ZSkge1xuICAgICAgaWYgKHBhcmFtc1ZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlLmluZGV4T2YoJ25vdCAnKSA9PT0gMCkge1xuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnN1YnN0cig0KS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaW5wdXRWYWx1ZXMuZGVsZXRlKG5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaWYgKGlucHV0VmFsdWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZXMuZ2V0QWxsKG5hbWUpLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHsgbmV3VmFsdWVzLmFwcGVuZChuYW1lLCB2YWx1ZSkgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBuZXdWYWx1ZXNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0FuY2hvckxpbmsoZWx0KSB7XG4gICAgcmV0dXJuICEhZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSA+PSAwXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IFtzd2FwSW5mb092ZXJyaWRlXVxuICogQHJldHVybnMge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBJbmZvT3ZlcnJpZGUpIHtcbiAgICBjb25zdCBzd2FwSW5mbyA9IHN3YXBJbmZvT3ZlcnJpZGUgfHwgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN3YXAnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBzd2FwU3BlYyA9IHtcbiAgICAgIHN3YXBTdHlsZTogZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCA/ICdpbm5lckhUTUwnIDogaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSxcbiAgICAgIHN3YXBEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFN3YXBEZWxheSxcbiAgICAgIHNldHRsZURlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U2V0dGxlRGVsYXlcbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLnNjcm9sbEludG9WaWV3T25Cb29zdCAmJiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmICFpc0FuY2hvckxpbmsoZWx0KSkge1xuICAgICAgc3dhcFNwZWMuc2hvdyA9ICd0b3AnXG4gICAgfVxuICAgIGlmIChzd2FwSW5mbykge1xuICAgICAgY29uc3Qgc3BsaXQgPSBzcGxpdE9uV2hpdGVzcGFjZShzd2FwSW5mbylcbiAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNwbGl0W2ldXG4gICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ3N3YXA6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDUpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2V0dGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zZXR0bGVEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDcpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZigndHJhbnNpdGlvbjonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMudHJhbnNpdGlvbiA9IHZhbHVlLnN1YnN0cigxMSkgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignaWdub3JlVGl0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gdmFsdWUuc3Vic3RyKDEyKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFNwZWMgPSB2YWx1ZS5zdWJzdHIoNylcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzY3JvbGxTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsID0gc2Nyb2xsVmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGxUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2hvdzonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2hvd1NwZWMgPSB2YWx1ZS5zdWJzdHIoNSlcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzaG93U3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzaG93VmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93ID0gc2hvd1ZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvd1RhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdmb2N1cy1zY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzU2Nyb2xsVmFsID0gdmFsdWUuc3Vic3RyKCdmb2N1cy1zY3JvbGw6Jy5sZW5ndGgpXG4gICAgICAgICAgICBzd2FwU3BlYy5mb2N1c1Njcm9sbCA9IGZvY3VzU2Nyb2xsVmFsID09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwU3R5bGUgPSB2YWx1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dFcnJvcignVW5rbm93biBtb2RpZmllciBpbiBoeC1zd2FwOiAnICsgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3BlY1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB1c2VzRm9ybURhdGEoZWx0KSB7XG4gICAgcmV0dXJuIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1lbmNvZGluZycpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfHxcbiAgICAobWF0Y2hlcyhlbHQsICdmb3JtJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2VuY3R5cGUnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmaWx0ZXJlZFBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgeyp8c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZFBhcmFtZXRlcnMpIHtcbiAgICBsZXQgZW5jb2RlZFBhcmFtZXRlcnMgPSBudWxsXG4gICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyA9PSBudWxsKSB7XG4gICAgICAgIGVuY29kZWRQYXJhbWV0ZXJzID0gZXh0ZW5zaW9uLmVuY29kZVBhcmFtZXRlcnMoeGhyLCBmaWx0ZXJlZFBhcmFtZXRlcnMsIGVsdClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5jb2RlZFBhcmFtZXRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbnZlcnNpb24gdG8gYW4gYWN0dWFsIEZvcm1EYXRhIG9iamVjdCBpbiBjYXNlIGZpbHRlcmVkUGFyYW1ldGVycyBpcyBhIGZvcm1EYXRhUHJveHlcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14L2lzc3Vlcy8yMzE3XG4gICAgICAgIHJldHVybiBvdmVycmlkZUZvcm1EYXRhKG5ldyBGb3JtRGF0YSgpLCBmb3JtRGF0YUZyb21PYmplY3QoZmlsdGVyZWRQYXJhbWV0ZXJzKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmxFbmNvZGUoZmlsdGVyZWRQYXJhbWV0ZXJzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7SHRteFNldHRsZUluZm99XG4gKi9cbiAgZnVuY3Rpb24gbWFrZVNldHRsZUluZm8odGFyZ2V0KSB7XG4gICAgcmV0dXJuIHsgdGFza3M6IFtdLCBlbHRzOiBbdGFyZ2V0XSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxTdGF0ZShjb250ZW50LCBzd2FwU3BlYykge1xuICAgIGNvbnN0IGZpcnN0ID0gY29udGVudFswXVxuICAgIGNvbnN0IGxhc3QgPSBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV1cbiAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbFRhcmdldCkge1xuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gMFxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gdGFyZ2V0LnNjcm9sbEhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3dhcFNwZWMuc2hvdykge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0KSB7XG4gICAgICAgIGxldCB0YXJnZXRTdHIgPSBzd2FwU3BlYy5zaG93VGFyZ2V0XG4gICAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0ID09PSAnd2luZG93Jykge1xuICAgICAgICAgIHRhcmdldFN0ciA9ICdib2R5J1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCB0YXJnZXRTdHIpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBldmFsQXNEZWZhdWx0XG4gKiBAcGFyYW0ge09iamVjdD19IHZhbHVlc1xuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICB2YWx1ZXMgPSB7fVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZXNcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgICBsZXQgc3RyID0gYXR0cmlidXRlVmFsdWUudHJpbSgpXG4gICAgICBsZXQgZXZhbHVhdGVWYWx1ZSA9IGV2YWxBc0RlZmF1bHRcbiAgICAgIGlmIChzdHIgPT09ICd1bnNldCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDExKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdHIuaW5kZXhPZignanM6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigzKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCd7JykgIT09IDApIHtcbiAgICAgICAgc3RyID0gJ3snICsgc3RyICsgJ30nXG4gICAgICB9XG4gICAgICBsZXQgdmFyc1ZhbHVlc1xuICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkgeyByZXR1cm4gRnVuY3Rpb24oJ3JldHVybiAoJyArIHN0ciArICcpJykoKSB9LCB7fSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBwYXJzZUpTT04oc3RyKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFyc1ZhbHVlcykge1xuICAgICAgICBpZiAodmFyc1ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gdmFyc1ZhbHVlc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7KCkgPT4gYW55fSB0b0V2YWxcbiAgICogQHBhcmFtIHthbnk9fSBkZWZhdWx0VmFsXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUV2YWwoZWx0LCB0b0V2YWwsIGRlZmF1bHRWYWwpIHtcbiAgICBpZiAoaHRteC5jb25maWcuYWxsb3dFdmFsKSB7XG4gICAgICByZXR1cm4gdG9FdmFsKClcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpldmFsRGlzYWxsb3dlZEVycm9yJylcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFycycsIHRydWUsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFscycsIGZhbHNlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBnZXRFeHByZXNzaW9uVmFycyhlbHQpIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3RzKGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0KSwgZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGhlYWRlclZhbHVlXG4gICAqL1xuICBmdW5jdGlvbiBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpIHtcbiAgICBpZiAoaGVhZGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBPbiBhbiBleGNlcHRpb24sIHRyeSB0byBzZXQgdGhlIGhlYWRlciBVUkkgZW5jb2RlZCBpbnN0ZWFkXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgZW5jb2RlVVJJQ29tcG9uZW50KGhlYWRlclZhbHVlKSlcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyICsgJy1VUkktQXV0b0VuY29kZWQnLCAndHJ1ZScpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocikge1xuICAvLyBOQjogSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgc3R1ZmZcbiAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICYmIHR5cGVvZiAoVVJMKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoeGhyLnJlc3BvbnNlVVJMKVxuICAgICAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJhZFJlc3BvbnNlVXJsJywgeyB1cmw6IHhoci5yZXNwb25zZVVSTCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzSGVhZGVyKHhociwgcmVnZXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cC50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZXMgYW4gaHRteC1zdHlsZSBBSkFYIHJlcXVlc3RcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWpheFxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBVUkwgcGF0aCB0byBtYWtlIHRoZSBBSkFYXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd8SHRteEFqYXhIZWxwZXJDb250ZXh0fSBjb250ZXh0IHRoZSBlbGVtZW50IHRvIHRhcmdldCAoZGVmYXVsdHMgdG8gdGhlICoqYm9keSoqKSB8IGEgc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgfCBhIGNvbnRleHQgb2JqZWN0IHRoYXQgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmdcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5IGlmIG5vIHJlcXVlc3QgaXMgc2VudCwgb3Igd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgZnVuY3Rpb24gYWpheEhlbHBlcih2ZXJiLCBwYXRoLCBjb250ZXh0KSB7XG4gICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8odmVyYi50b0xvd2VyQ2FzZSgpKSlcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dCksXG4gICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgcmVzb2x2ZVRhcmdldChjb250ZXh0LnNvdXJjZSksIGNvbnRleHQuZXZlbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGFuZGxlcjogY29udGV4dC5oYW5kbGVyLFxuICAgICAgICAgICAgaGVhZGVyczogY29udGV4dC5oZWFkZXJzLFxuICAgICAgICAgICAgdmFsdWVzOiBjb250ZXh0LnZhbHVlcyxcbiAgICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQudGFyZ2V0KSxcbiAgICAgICAgICAgIHN3YXBPdmVycmlkZTogY29udGV4dC5zd2FwLFxuICAgICAgICAgICAgc2VsZWN0OiBjb250ZXh0LnNlbGVjdCxcbiAgICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGhpZXJhcmNoeUZvckVsdChlbHQpIHtcbiAgICBjb25zdCBhcnIgPSBbXVxuICAgIHdoaWxlIChlbHQpIHtcbiAgICAgIGFyci5wdXNoKGVsdClcbiAgICAgIGVsdCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB2ZXJpZnlQYXRoKGVsdCwgcGF0aCwgcmVxdWVzdENvbmZpZykge1xuICAgIGxldCBzYW1lSG9zdFxuICAgIGxldCB1cmxcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXJsID0gbmV3IFVSTChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKVxuICAgICAgY29uc3Qgb3JpZ2luID0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgICBzYW1lSG9zdCA9IG9yaWdpbiA9PT0gdXJsLm9yaWdpblxuICAgIH0gZWxzZSB7XG4gICAgLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgVVJMXG4gICAgICB1cmwgPSBwYXRoXG4gICAgICBzYW1lSG9zdCA9IHN0YXJ0c1dpdGgocGF0aCwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5zZWxmUmVxdWVzdHNPbmx5KSB7XG4gICAgICBpZiAoIXNhbWVIb3N0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGVVcmwnLCBtZXJnZU9iamVjdHMoeyB1cmwsIHNhbWVIb3N0IH0sIHJlcXVlc3RDb25maWcpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZvcm1EYXRhfSBvYmpcbiAgICogQHJldHVybiB7Rm9ybURhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvcm1EYXRhKSByZXR1cm4gb2JqXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0uZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9ialtrZXldLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgIShvYmpba2V5XSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgSlNPTi5zdHJpbmdpZnkob2JqW2tleV0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhQXJyYXlQcm94eShmb3JtRGF0YSwgbmFtZSwgYXJyYXkpIHtcbiAgICAvLyBtdXRhdGluZyB0aGUgYXJyYXkgc2hvdWxkIG11dGF0ZSB0aGUgdW5kZXJseWluZyBmb3JtIGRhdGFcbiAgICByZXR1cm4gbmV3IFByb3h5KGFycmF5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIGlmIChrZXkgPT09ICdsZW5ndGgnKSByZXR1cm4gdGFyZ2V0Lmxlbmd0aFxuICAgICAgICBpZiAoa2V5ID09PSAncHVzaCcpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpXG4gICAgICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldFtrZXldICYmIHRhcmdldFtrZXldLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFQcm94eShmb3JtRGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZm9ybURhdGEsIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHN5bWJvbCBjYWxscyB0byB0aGUgRm9ybURhdGEgaXRzZWxmIGRpcmVjdGx5XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgbmFtZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ3RvSlNPTicpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IEpTT04uc3RyaW5naWZ5IGNhbGwgb24gcHJveHlcbiAgICAgICAgICByZXR1cm4gKCkgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lIGluIHRhcmdldCkge1xuICAgICAgICAgIC8vIFdyYXAgaW4gZnVuY3Rpb24gd2l0aCBhcHBseSB0byBjb3JyZWN0bHkgYmluZCB0aGUgRm9ybURhdGEgY29udGV4dCwgYXMgYSBkaXJlY3QgY2FsbCB3b3VsZCByZXN1bHQgaW4gYW4gaWxsZWdhbCBpbnZvY2F0aW9uIGVycm9yXG4gICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcm1EYXRhW25hbWVdLmFwcGx5KGZvcm1EYXRhLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXkgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgICAgLy8gVGhvc2UgMiB1bmRlZmluZWQgJiBzaW5nbGUgdmFsdWUgcmV0dXJucyBhcmUgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkgYXMgd2Ugd2VyZW4ndCB1c2luZyBGb3JtRGF0YSBiZWZvcmVcbiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gYXJyYXlbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZm9ybURhdGFBcnJheVByb3h5KHRhcmdldCwgbmFtZSwgYXJyYXkpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IHRhcmdldC5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEodmFsdWUgaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICAvLyBTdXBwb3J0IE9iamVjdC5hc3NpZ24gY2FsbCBmcm9tIHByb3h5XG4gICAgICBvd25LZXlzOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSlcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRhcmdldCwgcHJvcCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCksIHByb3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7SHRteEFqYXhFdGN9IFtldGNdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmZpcm1lZF1cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCBjb25maXJtZWQpIHtcbiAgICBsZXQgcmVzb2x2ZSA9IG51bGxcbiAgICBsZXQgcmVqZWN0ID0gbnVsbFxuICAgIGV0YyA9IGV0YyAhPSBudWxsID8gZXRjIDoge31cbiAgICBpZiAoZXRjLnJldHVyblByb21pc2UgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICByZWplY3QgPSBfcmVqZWN0XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIGVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZUhhbmRsZXIgPSBldGMuaGFuZGxlciB8fCBoYW5kbGVBamF4UmVzcG9uc2VcbiAgICBjb25zdCBzZWxlY3QgPSBldGMuc2VsZWN0IHx8IG51bGxcblxuICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAvLyBkbyBub3QgaXNzdWUgcmVxdWVzdHMgZm9yIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV0Yy50YXJnZXRPdmVycmlkZSB8fCBhc0VsZW1lbnQoZ2V0VGFyZ2V0KGVsdCkpXG4gICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IHRhcmdldCA9PSBEVU1NWV9FTFQpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGFyZ2V0RXJyb3InLCB7IHRhcmdldDogZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JykgfSlcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGxldCBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBjb25zdCBzdWJtaXR0ZXIgPSBlbHREYXRhLmxhc3RCdXR0b25DbGlja2VkXG5cbiAgICBpZiAoc3VibWl0dGVyKSB7XG4gICAgICBjb25zdCBidXR0b25QYXRoID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1hY3Rpb24nKVxuICAgICAgaWYgKGJ1dHRvblBhdGggIT0gbnVsbCkge1xuICAgICAgICBwYXRoID0gYnV0dG9uUGF0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25WZXJiID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1tZXRob2QnKVxuICAgICAgaWYgKGJ1dHRvblZlcmIgIT0gbnVsbCkge1xuICAgICAgLy8gaWdub3JlIGJ1dHRvbnMgd2l0aCBmb3JtbWV0aG9kPVwiZGlhbG9nXCJcbiAgICAgICAgaWYgKGJ1dHRvblZlcmIudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyhidXR0b25WZXJiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm1RdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1jb25maXJtJylcbiAgICAvLyBhbGxvdyBldmVudC1iYXNlZCBjb25maXJtYXRpb24gdy8gYSBjYWxsYmFja1xuICAgIGlmIChjb25maXJtZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNzdWVSZXF1ZXN0ID0gZnVuY3Rpb24oc2tpcENvbmZpcm1hdGlvbikge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsICEhc2tpcENvbmZpcm1hdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpcm1EZXRhaWxzID0geyB0YXJnZXQsIGVsdCwgcGF0aCwgdmVyYiwgdHJpZ2dlcmluZ0V2ZW50OiBldmVudCwgZXRjLCBpc3N1ZVJlcXVlc3QsIHF1ZXN0aW9uOiBjb25maXJtUXVlc3Rpb24gfVxuICAgICAgaWYgKHRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpcm0nLCBjb25maXJtRGV0YWlscykgPT09IGZhbHNlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzeW5jRWx0ID0gZWx0XG4gICAgbGV0IHN5bmNTdHJhdGVneSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zeW5jJylcbiAgICBsZXQgcXVldWVTdHJhdGVneSA9IG51bGxcbiAgICBsZXQgYWJvcnRhYmxlID0gZmFsc2VcbiAgICBpZiAoc3luY1N0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBzeW5jU3RyaW5ncyA9IHN5bmNTdHJhdGVneS5zcGxpdCgnOicpXG4gICAgICBjb25zdCBzZWxlY3RvciA9IHN5bmNTdHJpbmdzWzBdLnRyaW0oKVxuICAgICAgaWYgKHNlbGVjdG9yID09PSAndGhpcycpIHtcbiAgICAgICAgc3luY0VsdCA9IGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC1zeW5jJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN5bmNFbHQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHNlbGVjdG9yKSlcbiAgICAgIH1cbiAgICAgIC8vIGRlZmF1bHQgdG8gdGhlIGRyb3Agc3RyYXRlZ3lcbiAgICAgIHN5bmNTdHJhdGVneSA9IChzeW5jU3RyaW5nc1sxXSB8fCAnZHJvcCcpLnRyaW0oKVxuICAgICAgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShzeW5jRWx0KVxuICAgICAgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Ryb3AnICYmIGVsdERhdGEueGhyICYmIGVsdERhdGEuYWJvcnRhYmxlICE9PSB0cnVlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdhYm9ydCcpIHtcbiAgICAgICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhYm9ydGFibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAncmVwbGFjZScpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5LmluZGV4T2YoJ3F1ZXVlJykgPT09IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVTdHJBcnJheSA9IHN5bmNTdHJhdGVneS5zcGxpdCgnICcpXG4gICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAocXVldWVTdHJBcnJheVsxXSB8fCAnbGFzdCcpLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgaWYgKGVsdERhdGEuYWJvcnRhYmxlKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZlbnQpXG4gICAgICAgICAgICBpZiAoZXZlbnREYXRhICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyAmJiBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWUpIHtcbiAgICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9IGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gJ2xhc3QnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID09IG51bGwpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2ZpcnN0JyAmJiBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdsYXN0Jykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXSAvLyBkdW1wIGV4aXN0aW5nIHF1ZXVlXG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGVsdERhdGEueGhyID0geGhyXG4gICAgZWx0RGF0YS5hYm9ydGFibGUgPSBhYm9ydGFibGVcbiAgICBjb25zdCBlbmRSZXF1ZXN0TG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWx0RGF0YS54aHIgPSBudWxsXG4gICAgICBlbHREYXRhLmFib3J0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyAhPSBudWxsICYmXG4gICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVkUmVxdWVzdCA9IGVsdERhdGEucXVldWVkUmVxdWVzdHMuc2hpZnQoKVxuICAgICAgICBxdWV1ZWRSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvbXB0UXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHJvbXB0JylcbiAgICBpZiAocHJvbXB0UXVlc3Rpb24pIHtcbiAgICAgIHZhciBwcm9tcHRSZXNwb25zZSA9IHByb21wdChwcm9tcHRRdWVzdGlvbilcbiAgICAgIC8vIHByb21wdCByZXR1cm5zIG51bGwgaWYgY2FuY2VsbGVkIGFuZCBlbXB0eSBzdHJpbmcgaWYgYWNjZXB0ZWQgd2l0aCBubyBlbnRyeVxuICAgICAgaWYgKHByb21wdFJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgICAhdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cHJvbXB0JywgeyBwcm9tcHQ6IHByb21wdFJlc3BvbnNlLCB0YXJnZXQgfSkpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybVF1ZXN0aW9uICYmICFjb25maXJtZWQpIHtcbiAgICAgIGlmICghY29uZmlybShjb25maXJtUXVlc3Rpb24pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHRSZXNwb25zZSlcblxuICAgIGlmICh2ZXJiICE9PSAnZ2V0JyAmJiAhdXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICB9XG5cbiAgICBpZiAoZXRjLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMgPSBtZXJnZU9iamVjdHMoaGVhZGVycywgZXRjLmhlYWRlcnMpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpXG4gICAgbGV0IGVycm9ycyA9IHJlc3VsdHMuZXJyb3JzXG4gICAgY29uc3QgcmF3Rm9ybURhdGEgPSByZXN1bHRzLmZvcm1EYXRhXG4gICAgaWYgKGV0Yy52YWx1ZXMpIHtcbiAgICAgIG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGZvcm1EYXRhRnJvbU9iamVjdChldGMudmFsdWVzKSlcbiAgICB9XG4gICAgY29uc3QgZXhwcmVzc2lvblZhcnMgPSBmb3JtRGF0YUZyb21PYmplY3QoZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSlcbiAgICBjb25zdCBhbGxGb3JtRGF0YSA9IG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGV4cHJlc3Npb25WYXJzKVxuICAgIGxldCBmaWx0ZXJlZEZvcm1EYXRhID0gZmlsdGVyVmFsdWVzKGFsbEZvcm1EYXRhLCBlbHQpXG5cbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSAmJiB2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgZmlsdGVyZWRGb3JtRGF0YS5zZXQoJ29yZy5odG14LmNhY2hlLWJ1c3RlcicsIGdldFJhd0F0dHJpYnV0ZSh0YXJnZXQsICdpZCcpIHx8ICd0cnVlJylcbiAgICB9XG5cbiAgICAvLyBiZWhhdmlvciBvZiBhbmNob3JzIHcvIGVtcHR5IGhyZWYgaXMgdG8gdXNlIHRoZSBjdXJyZW50IFVSTFxuICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aCA9PT0gJycpIHtcbiAgICAgIHBhdGggPSBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtub0hlYWRlcnNdXG4gICAgICovXG4gICAgY29uc3QgcmVxdWVzdEF0dHJWYWx1ZXMgPSBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXJlcXVlc3QnKVxuXG4gICAgY29uc3QgZWx0SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHVzZVVybFBhcmFtcyA9IGh0bXguY29uZmlnLm1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zLmluZGV4T2YodmVyYikgPj0gMFxuXG4gICAgLyoqIEB0eXBlIEh0bXhSZXF1ZXN0Q29uZmlnICovXG4gICAgY29uc3QgcmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHVzZVVybFBhcmFtcyxcbiAgICAgIGZvcm1EYXRhOiBmaWx0ZXJlZEZvcm1EYXRhLFxuICAgICAgcGFyYW1ldGVyczogZm9ybURhdGFQcm94eShmaWx0ZXJlZEZvcm1EYXRhKSxcbiAgICAgIHVuZmlsdGVyZWRGb3JtRGF0YTogYWxsRm9ybURhdGEsXG4gICAgICB1bmZpbHRlcmVkUGFyYW1ldGVyczogZm9ybURhdGFQcm94eShhbGxGb3JtRGF0YSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdmVyYixcbiAgICAgIGVycm9ycyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogZXRjLmNyZWRlbnRpYWxzIHx8IHJlcXVlc3RBdHRyVmFsdWVzLmNyZWRlbnRpYWxzIHx8IGh0bXguY29uZmlnLndpdGhDcmVkZW50aWFscyxcbiAgICAgIHRpbWVvdXQ6IGV0Yy50aW1lb3V0IHx8IHJlcXVlc3RBdHRyVmFsdWVzLnRpbWVvdXQgfHwgaHRteC5jb25maWcudGltZW91dCxcbiAgICAgIHBhdGgsXG4gICAgICB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50XG4gICAgfVxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maWdSZXF1ZXN0JywgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICAvLyBjb3B5IG91dCBpbiBjYXNlIHRoZSBvYmplY3Qgd2FzIG92ZXJ3cml0dGVuXG4gICAgcGF0aCA9IHJlcXVlc3RDb25maWcucGF0aFxuICAgIHZlcmIgPSByZXF1ZXN0Q29uZmlnLnZlcmJcbiAgICBoZWFkZXJzID0gcmVxdWVzdENvbmZpZy5oZWFkZXJzXG4gICAgZmlsdGVyZWRGb3JtRGF0YSA9IGZvcm1EYXRhRnJvbU9iamVjdChyZXF1ZXN0Q29uZmlnLnBhcmFtZXRlcnMpXG4gICAgZXJyb3JzID0gcmVxdWVzdENvbmZpZy5lcnJvcnNcbiAgICB1c2VVcmxQYXJhbXMgPSByZXF1ZXN0Q29uZmlnLnVzZVVybFBhcmFtc1xuXG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGlvbjpoYWx0ZWQnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0UGF0aCA9IHBhdGguc3BsaXQoJyMnKVxuICAgIGNvbnN0IHBhdGhOb0FuY2hvciA9IHNwbGl0UGF0aFswXVxuICAgIGNvbnN0IGFuY2hvciA9IHNwbGl0UGF0aFsxXVxuXG4gICAgbGV0IGZpbmFsUGF0aCA9IHBhdGhcbiAgICBpZiAodXNlVXJsUGFyYW1zKSB7XG4gICAgICBmaW5hbFBhdGggPSBwYXRoTm9BbmNob3JcbiAgICAgIGNvbnN0IGhhc1ZhbHVlcyA9ICFmaWx0ZXJlZEZvcm1EYXRhLmtleXMoKS5uZXh0KCkuZG9uZVxuICAgICAgaWYgKGhhc1ZhbHVlcykge1xuICAgICAgICBpZiAoZmluYWxQYXRoLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJz8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcmJ1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsUGF0aCArPSB1cmxFbmNvZGUoZmlsdGVyZWRGb3JtRGF0YSlcbiAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnIycgKyBhbmNob3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdmVyaWZ5UGF0aChlbHQsIGZpbmFsUGF0aCwgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6aW52YWxpZFBhdGgnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgeGhyLm9wZW4odmVyYi50b1VwcGVyQ2FzZSgpLCBmaW5hbFBhdGgsIHRydWUpXG4gICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvaHRtbCcpXG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHJlcXVlc3RDb25maWcud2l0aENyZWRlbnRpYWxzXG4gICAgeGhyLnRpbWVvdXQgPSByZXF1ZXN0Q29uZmlnLnRpbWVvdXRcblxuICAgIC8vIHJlcXVlc3QgaGVhZGVyc1xuICAgIGlmIChyZXF1ZXN0QXR0clZhbHVlcy5ub0hlYWRlcnMpIHtcbiAgICAvLyBpZ25vcmUgYWxsIGhlYWRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlcl1cbiAgICAgICAgICBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0h0bXhSZXNwb25zZUluZm99ICovXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvID0ge1xuICAgICAgeGhyLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcmVxdWVzdENvbmZpZyxcbiAgICAgIGV0YyxcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHNlbGVjdCxcbiAgICAgIHBhdGhJbmZvOiB7XG4gICAgICAgIHJlcXVlc3RQYXRoOiBwYXRoLFxuICAgICAgICBmaW5hbFJlcXVlc3RQYXRoOiBmaW5hbFBhdGgsXG4gICAgICAgIHJlc3BvbnNlUGF0aDogbnVsbCxcbiAgICAgICAgYW5jaG9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGllcmFyY2h5ID0gaGllcmFyY2h5Rm9yRWx0KGVsdClcbiAgICAgICAgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aCA9IGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKVxuICAgICAgICByZXNwb25zZUhhbmRsZXIoZWx0LCByZXNwb25zZUluZm8pXG4gICAgICAgIGlmIChyZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgIT09IHRydWUpIHtcbiAgICAgICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAvLyBpZiB0aGUgYm9keSBubyBsb25nZXIgY29udGFpbnMgdGhlIGVsZW1lbnQsIHRyaWdnZXIgdGhlIGV2ZW50IG9uIHRoZSBjbG9zZXN0IHBhcmVudFxuICAgICAgICAvLyByZW1haW5pbmcgaW4gdGhlIERPTVxuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgbGV0IHNlY29uZGFyeVRyaWdnZXJFbHQgPSBudWxsXG4gICAgICAgICAgd2hpbGUgKGhpZXJhcmNoeS5sZW5ndGggPiAwICYmIHNlY29uZGFyeVRyaWdnZXJFbHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50RWx0SW5IaWVyYXJjaHkgPSBoaWVyYXJjaHkuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKGJvZHlDb250YWlucyhwYXJlbnRFbHRJbkhpZXJhcmNoeSkpIHtcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IHBhcmVudEVsdEluSGllcmFyY2h5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWNvbmRhcnlUcmlnZ2VyRWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14Om9uTG9hZEVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgdGhyb3cgZVxuICAgICAgfVxuICAgIH1cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRBYm9ydCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRpbWVvdXQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVJlcXVlc3QnLCByZXNwb25zZUluZm8pKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIHZhciBpbmRpY2F0b3JzID0gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KVxuICAgIHZhciBkaXNhYmxlRWx0cyA9IGRpc2FibGVFbGVtZW50cyhlbHQpXG5cbiAgICBmb3JFYWNoKFsnbG9hZHN0YXJ0JywgJ2xvYWRlbmQnLCAncHJvZ3Jlc3MnLCAnYWJvcnQnXSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBmb3JFYWNoKFt4aHIsIHhoci51cGxvYWRdLCBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnhocjonICsgZXZlbnROYW1lLCB7XG4gICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudC5sZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogZXZlbnQudG90YWxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVNlbmQnLCByZXNwb25zZUluZm8pXG4gICAgY29uc3QgcGFyYW1zID0gdXNlVXJsUGFyYW1zID8gbnVsbCA6IGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkRm9ybURhdGEpXG4gICAgeGhyLnNlbmQocGFyYW1zKVxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlVcGRhdGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3R5cGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFtwYXRoXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICogQHJldHVybiB7SHRteEhpc3RvcnlVcGRhdGV9XG4gICAqL1xuICBmdW5jdGlvbiBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBGaXJzdCBjb25zdWx0IHJlc3BvbnNlIGhlYWRlcnNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IHBhdGhGcm9tSGVhZGVycyA9IG51bGxcbiAgICBsZXQgdHlwZUZyb21IZWFkZXJzID0gbnVsbFxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaC1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVwbGFjZS1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlcGxhY2UtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdyZXBsYWNlJ1xuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIHdhcyBhIHJlc3BvbnNlIGhlYWRlciwgdGhhdCBoYXMgcHJpb3JpdHlcbiAgICBpZiAocGF0aEZyb21IZWFkZXJzKSB7XG4gICAgICBpZiAocGF0aEZyb21IZWFkZXJzID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0eXBlRnJvbUhlYWRlcnMsXG4gICAgICAgICAgcGF0aDogcGF0aEZyb21IZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTmV4dCByZXNvbHZlIHZpYSBET00gdmFsdWVzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmZpbmFsUmVxdWVzdFBhdGhcbiAgICBjb25zdCByZXNwb25zZVBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoXG5cbiAgICBjb25zdCBwdXNoVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXB1c2gtdXJsJylcbiAgICBjb25zdCByZXBsYWNlVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXJlcGxhY2UtdXJsJylcbiAgICBjb25zdCBlbGVtZW50SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHNhdmVUeXBlID0gbnVsbFxuICAgIGxldCBwYXRoID0gbnVsbFxuXG4gICAgaWYgKHB1c2hVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcHVzaFVybFxuICAgIH0gZWxzZSBpZiAocmVwbGFjZVVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncmVwbGFjZSdcbiAgICAgIHBhdGggPSByZXBsYWNlVXJsXG4gICAgfSBlbHNlIGlmIChlbGVtZW50SXNCb29zdGVkKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgIC8vIGZhbHNlIGluZGljYXRlcyBubyBwdXNoLCByZXR1cm4gZW1wdHkgb2JqZWN0XG4gICAgICBpZiAocGF0aCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgLy8gdHJ1ZSBpbmRpY2F0ZXMgd2Ugd2FudCB0byBmb2xsb3cgd2hlcmV2ZXIgdGhlIHNlcnZlciBlbmRlZCB1cCBzZW5kaW5nIHVzXG4gICAgICBpZiAocGF0aCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgICB9XG5cbiAgICAgIC8vIHJlc3RvcmUgYW55IGFuY2hvciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RcbiAgICAgIGlmIChyZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yICYmIHBhdGguaW5kZXhPZignIycpID09PSAtMSkge1xuICAgICAgICBwYXRoID0gcGF0aCArICcjJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogc2F2ZVR5cGUsXG4gICAgICAgIHBhdGhcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9IHJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0NvbmZpZywgc3RhdHVzKSB7XG4gICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVzcG9uc2VIYW5kbGluZ0NvbmZpZy5jb2RlKVxuICAgIHJldHVybiByZWdFeHAudGVzdChzdGF0dXMudG9TdHJpbmcoMTApKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ31cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnICovXG4gICAgICB2YXIgcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQgPSBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nW2ldXG4gICAgICBpZiAoY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQsIHhoci5zdGF0dXMpKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUhhbmRsaW5nRWxlbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBubyBtYXRjaGVzLCByZXR1cm4gbm8gc3dhcFxuICAgIHJldHVybiB7XG4gICAgICBzd2FwOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRpdGxlKHRpdGxlKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBjb25zdCB0aXRsZUVsdCA9IGZpbmQoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsdCkge1xuICAgICAgICB0aXRsZUVsdC5pbm5lckhUTUwgPSB0aXRsZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnRpdGxlID0gdGl0bGVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUFqYXhSZXNwb25zZShlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcbiAgICBsZXQgdGFyZ2V0ID0gcmVzcG9uc2VJbmZvLnRhcmdldFxuICAgIGNvbnN0IGV0YyA9IHJlc3BvbnNlSW5mby5ldGNcbiAgICBjb25zdCByZXNwb25zZUluZm9TZWxlY3QgPSByZXNwb25zZUluZm8uc2VsZWN0XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZU9uTG9hZCcsIHJlc3BvbnNlSW5mbykpIHJldHVyblxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyOi9pKSkge1xuICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyJywgZWx0KVxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtTG9jYXRpb246L2kpKSB7XG4gICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgbGV0IHJlZGlyZWN0UGF0aCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtTG9jYXRpb24nKVxuICAgICAgLyoqIEB0eXBlIHtIdG14QWpheEhlbHBlckNvbnRleHQme3BhdGg6c3RyaW5nfX0gKi9cbiAgICAgIHZhciByZWRpcmVjdFN3YXBTcGVjXG4gICAgICBpZiAocmVkaXJlY3RQYXRoLmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgICByZWRpcmVjdFN3YXBTcGVjID0gcGFyc2VKU09OKHJlZGlyZWN0UGF0aClcbiAgICAgICAgLy8gd2hhdCdzIHRoZSBiZXN0IHdheSB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdXNlciBkaWRuJ3QgaW5jbHVkZSB0aGlzXG4gICAgICAgIHJlZGlyZWN0UGF0aCA9IHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgICBkZWxldGUgcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICB9XG4gICAgICBhamF4SGVscGVyKCdnZXQnLCByZWRpcmVjdFBhdGgsIHJlZGlyZWN0U3dhcFNwZWMpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShyZWRpcmVjdFBhdGgpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUmVmcmVzaCA9IGhhc0hlYWRlcih4aHIsIC9IWC1SZWZyZXNoOi9pKSAmJiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZnJlc2gnKSA9PT0gJ3RydWUnXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlZGlyZWN0Oi9pKSkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24uaHJlZiA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVkaXJlY3QnKVxuICAgICAgc2hvdWxkUmVmcmVzaCAmJiBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlZnJlc2gpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGlzdG9yeVVwZGF0ZSA9IGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKVxuXG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGluZyA9IHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocilcbiAgICBjb25zdCBzaG91bGRTd2FwID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwXG4gICAgbGV0IGlzRXJyb3IgPSAhIXJlc3BvbnNlSGFuZGxpbmcuZXJyb3JcbiAgICBsZXQgaWdub3JlVGl0bGUgPSBodG14LmNvbmZpZy5pZ25vcmVUaXRsZSB8fCByZXNwb25zZUhhbmRsaW5nLmlnbm9yZVRpdGxlXG4gICAgbGV0IHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zZWxlY3RcbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy50YXJnZXQpIHtcbiAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSlcbiAgICB9XG4gICAgdmFyIHN3YXBPdmVycmlkZSA9IGV0Yy5zd2FwT3ZlcnJpZGVcbiAgICBpZiAoc3dhcE92ZXJyaWRlID09IG51bGwgJiYgcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGUpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlXG4gICAgfVxuXG4gICAgLy8gcmVzcG9uc2UgaGVhZGVycyBvdmVycmlkZSByZXNwb25zZSBoYW5kbGluZyBjb25maWdcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgIH1cblxuICAgIHZhciBzZXJ2ZXJSZXNwb25zZSA9IHhoci5yZXNwb25zZVxuICAgIC8qKiBAdHlwZSBIdG14QmVmb3JlU3dhcERldGFpbHMgKi9cbiAgICB2YXIgYmVmb3JlU3dhcERldGFpbHMgPSBtZXJnZU9iamVjdHMoe1xuICAgICAgc2hvdWxkU3dhcCxcbiAgICAgIHNlcnZlclJlc3BvbnNlLFxuICAgICAgaXNFcnJvcixcbiAgICAgIGlnbm9yZVRpdGxlLFxuICAgICAgc2VsZWN0T3ZlcnJpZGVcbiAgICB9LCByZXNwb25zZUluZm8pXG5cbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy5ldmVudCAmJiAhdHJpZ2dlckV2ZW50KHRhcmdldCwgcmVzcG9uc2VIYW5kbGluZy5ldmVudCwgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6YmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgc2VydmVyUmVzcG9uc2UgPSBiZWZvcmVTd2FwRGV0YWlscy5zZXJ2ZXJSZXNwb25zZSAvLyBhbGxvdyB1cGRhdGluZyBjb250ZW50XG4gICAgaXNFcnJvciA9IGJlZm9yZVN3YXBEZXRhaWxzLmlzRXJyb3IgLy8gYWxsb3cgdXBkYXRpbmcgZXJyb3JcbiAgICBpZ25vcmVUaXRsZSA9IGJlZm9yZVN3YXBEZXRhaWxzLmlnbm9yZVRpdGxlIC8vIGFsbG93IHVwZGF0aW5nIGlnbm9yaW5nIHRpdGxlXG4gICAgc2VsZWN0T3ZlcnJpZGUgPSBiZWZvcmVTd2FwRGV0YWlscy5zZWxlY3RPdmVycmlkZSAvLyBhbGxvdyB1cGRhdGluZyBzZWxlY3Qgb3ZlcnJpZGVcblxuICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSB0YXJnZXQgLy8gTWFrZSB1cGRhdGVkIHRhcmdldCBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLmZhaWxlZCA9IGlzRXJyb3IgLy8gTWFrZSBmYWlsZWQgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5zdWNjZXNzZnVsID0gIWlzRXJyb3IgLy8gTWFrZSBzdWNjZXNzZnVsIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcblxuICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjg2KSB7XG4gICAgICAgIGNhbmNlbFBvbGxpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IGV4dGVuc2lvbi50cmFuc2Zvcm1SZXNwb25zZShzZXJ2ZXJSZXNwb25zZSwgeGhyLCBlbHQpXG4gICAgICB9KVxuXG4gICAgICAvLyBTYXZlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSB3aWxsIGJlIGEgaGlzdG9yeSB1cGRhdGVcbiAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICAgIH1cbiAgICAgIHZhciBzd2FwU3BlYyA9IGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcE92ZXJyaWRlKVxuXG4gICAgICBpZiAoIXN3YXBTcGVjLmhhc093blByb3BlcnR5KCdpZ25vcmVUaXRsZScpKSB7XG4gICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gaWdub3JlVGl0bGVcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcblxuICAgICAgLy8gb3B0aW9uYWwgdHJhbnNpdGlvbiBBUEkgcHJvbWlzZSBjYWxsYmFja3NcbiAgICAgIGxldCBzZXR0bGVSZXNvbHZlID0gbnVsbFxuICAgICAgbGV0IHNldHRsZVJlamVjdCA9IG51bGxcblxuICAgICAgaWYgKHJlc3BvbnNlSW5mb1NlbGVjdCkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSW5mb1NlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc2VsZWN0Oi9pKSkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzZWxlY3QnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3RPT0IgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0LW9vYicpXG4gICAgICBjb25zdCBzZWxlY3QgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0JylcblxuICAgICAgbGV0IGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGlmIHdlIG5lZWQgdG8gc2F2ZSBoaXN0b3J5LCBkbyBzbywgYmVmb3JlIHN3YXBwaW5nIHNvIHRoYXQgcmVsYXRpdmUgcmVzb3VyY2VzIGhhdmUgdGhlIGNvcnJlY3QgYmFzZSBVUkxcbiAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5VXBkYXRlJywgbWVyZ2VPYmplY3RzKHsgaGlzdG9yeTogaGlzdG9yeVVwZGF0ZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnB1c2hlZEludG9IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VVcmxJbkhpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpyZXBsYWNlZEluSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dhcCh0YXJnZXQsIHNlcnZlclJlc3BvbnNlLCBzd2FwU3BlYywge1xuICAgICAgICAgICAgc2VsZWN0OiBzZWxlY3RPdmVycmlkZSB8fCBzZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3RPT0IsXG4gICAgICAgICAgICBldmVudEluZm86IHJlc3BvbnNlSW5mbyxcbiAgICAgICAgICAgIGFuY2hvcjogcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvcixcbiAgICAgICAgICAgIGNvbnRleHRFbGVtZW50OiBlbHQsXG4gICAgICAgICAgICBhZnRlclN3YXBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1Td2FwOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1Td2FwJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlclNldHRsZUNhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVNldHRsZTovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlc29sdmUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3dhcEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZWplY3QpXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBzaG91bGRUcmFuc2l0aW9uID0gaHRteC5jb25maWcuZ2xvYmFsVmlld1RyYW5zaXRpb25zXG4gICAgICBpZiAoc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ3RyYW5zaXRpb24nKSkge1xuICAgICAgICBzaG91bGRUcmFuc2l0aW9uID0gc3dhcFNwZWMudHJhbnNpdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVUcmFuc2l0aW9uJywgcmVzcG9uc2VJbmZvKSAmJlxuICAgICAgICAgICAgICB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBjb25zdCBzZXR0bGVQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgICBzZXR0bGVSZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgICBzZXR0bGVSZWplY3QgPSBfcmVqZWN0XG4gICAgICAgIH0pXG4gICAgICAgIC8vIHdyYXAgdGhlIG9yaWdpbmFsIGRvU3dhcCgpIGluIGEgY2FsbCB0byBzdGFydFZpZXdUcmFuc2l0aW9uKClcbiAgICAgICAgY29uc3QgaW5uZXJEb1N3YXAgPSBkb1N3YXBcbiAgICAgICAgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5uZXJEb1N3YXAoKVxuICAgICAgICAgICAgcmV0dXJuIHNldHRsZVByb21pc2VcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzd2FwU3BlYy5zd2FwRGVsYXkgPiAwKSB7XG4gICAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9Td2FwLCBzd2FwU3BlYy5zd2FwRGVsYXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1N3YXAoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNFcnJvcikge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpyZXNwb25zZUVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6ICdSZXNwb25zZSBTdGF0dXMgRXJyb3IgQ29kZSAnICsgeGhyLnN0YXR1cyArICcgZnJvbSAnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlcXVlc3RQYXRoIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXh0ZW5zaW9ucyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIEh0bXhFeHRlbnNpb24+fSAqL1xuICBjb25zdCBleHRlbnNpb25zID0ge31cblxuICAvKipcbiAgICogZXh0ZW5zaW9uQmFzZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYWxsIGV4dGVuc2lvbnMuXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZXh0ZW5zaW9uQmFzZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5pdDogZnVuY3Rpb24oYXBpKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgb25FdmVudDogZnVuY3Rpb24obmFtZSwgZXZ0KSB7IHJldHVybiB0cnVlIH0sXG4gICAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24odGV4dCwgeGhyLCBlbHQpIHsgcmV0dXJuIHRleHQgfSxcbiAgICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgaGFuZGxlU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24oeGhyLCBwYXJhbWV0ZXJzLCBlbHQpIHsgcmV0dXJuIG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZWZpbmVFeHRlbnNpb24gaW5pdGlhbGl6ZXMgdGhlIGV4dGVuc2lvbiBhbmQgYWRkcyBpdCB0byB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNkZWZpbmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbn0gZXh0ZW5zaW9uIHRoZSBleHRlbnNpb24gZGVmaW5pdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gZGVmaW5lRXh0ZW5zaW9uKG5hbWUsIGV4dGVuc2lvbikge1xuICAgIGlmIChleHRlbnNpb24uaW5pdCkge1xuICAgICAgZXh0ZW5zaW9uLmluaXQoaW50ZXJuYWxBUEkpXG4gICAgfVxuICAgIGV4dGVuc2lvbnNbbmFtZV0gPSBtZXJnZU9iamVjdHMoZXh0ZW5zaW9uQmFzZSgpLCBleHRlbnNpb24pXG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlRXh0ZW5zaW9uIHJlbW92ZXMgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFeHRlbnNpb24obmFtZSkge1xuICAgIGRlbGV0ZSBleHRlbnNpb25zW25hbWVdXG4gIH1cblxuICAvKipcbiAgICogZ2V0RXh0ZW5zaW9ucyBzZWFyY2hlcyB1cCB0aGUgRE9NIHRyZWUgdG8gcmV0dXJuIGFsbCBleHRlbnNpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbltdPX0gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nW109fSBleHRlbnNpb25zVG9JZ25vcmVcbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEV4dGVuc2lvbnMoZWx0LCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSkge1xuICAgIGlmIChleHRlbnNpb25zVG9SZXR1cm4gPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9SZXR1cm4gPSBbXVxuICAgIH1cbiAgICBpZiAoZWx0ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbnNUb1JldHVyblxuICAgIH1cbiAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlID0gW11cbiAgICB9XG4gICAgY29uc3QgZXh0ZW5zaW9uc0ZvckVsZW1lbnQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1leHQnKVxuICAgIGlmIChleHRlbnNpb25zRm9yRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChleHRlbnNpb25zRm9yRWxlbWVudC5zcGxpdCgnLCcpLCBmdW5jdGlvbihleHRlbnNpb25OYW1lKSB7XG4gICAgICAgIGV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb25OYW1lLnJlcGxhY2UoLyAvZywgJycpXG4gICAgICAgIGlmIChleHRlbnNpb25OYW1lLnNsaWNlKDAsIDcpID09ICdpZ25vcmU6Jykge1xuICAgICAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZS5wdXNoKGV4dGVuc2lvbk5hbWUuc2xpY2UoNykpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZS5pbmRleE9mKGV4dGVuc2lvbk5hbWUpIDwgMCkge1xuICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uTmFtZV1cbiAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmIGV4dGVuc2lvbnNUb1JldHVybi5pbmRleE9mKGV4dGVuc2lvbikgPCAwKSB7XG4gICAgICAgICAgICBleHRlbnNpb25zVG9SZXR1cm4ucHVzaChleHRlbnNpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEluaXRpYWxpemF0aW9uXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpc1JlYWR5ID0gZmFsc2VcbiAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgaXNSZWFkeSA9IHRydWVcbiAgfSlcblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIG5vdyBpZiBET01Db250ZW50TG9hZGVkIGhhcyBmaXJlZCwgb3RoZXJ3aXNlIGxpc3RlbiBmb3IgaXQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdXNlcyBpc1JlYWR5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGFzayB0aGUgYnJvd3NlciB3aGV0aGVyXG4gICAqIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gZmlyZWQ7IHRoZXJlJ3MgYSBnYXAgYmV0d2VlbiBET01Db250ZW50TG9hZGVkXG4gICAqIGZpcmluZyBhbmQgcmVhZHlzdGF0ZT1jb21wbGV0ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWR5KGZuKSB7XG4gICAgLy8gQ2hlY2tpbmcgcmVhZHlTdGF0ZSBoZXJlIGlzIGEgZmFpbHNhZmUgaW4gY2FzZSB0aGUgaHRteCBzY3JpcHQgdGFnIGVudGVyZWQgdGhlIERPTSBieVxuICAgIC8vIHNvbWUgbWVhbnMgb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQuXG4gICAgaWYgKGlzUmVhZHkgfHwgZ2V0RG9jdW1lbnQoKS5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICBmbigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydEluZGljYXRvclN0eWxlcygpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaW5jbHVkZUluZGljYXRvclN0eWxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG5vbmNlQXR0cmlidXRlID0gaHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZSA/IGAgbm9uY2U9XCIke2h0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2V9XCJgIDogJydcbiAgICAgIGdldERvY3VtZW50KCkuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsXG4gICAgICAgICc8c3R5bGUnICsgbm9uY2VBdHRyaWJ1dGUgKyAnPlxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjB9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJyAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJy4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgPC9zdHlsZT4nKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1ldGFDb25maWcoKSB7XG4gICAgLyoqIEB0eXBlIEhUTUxNZXRhRWxlbWVudCAqL1xuICAgIGNvbnN0IGVsZW1lbnQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImh0bXgtY29uZmlnXCJdJylcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHBhcnNlSlNPTihlbGVtZW50LmNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VNZXRhQ29uZmlnKCkge1xuICAgIGNvbnN0IG1ldGFDb25maWcgPSBnZXRNZXRhQ29uZmlnKClcbiAgICBpZiAobWV0YUNvbmZpZykge1xuICAgICAgaHRteC5jb25maWcgPSBtZXJnZU9iamVjdHMoaHRteC5jb25maWcsIG1ldGFDb25maWcpXG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnRcbiAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgbWVyZ2VNZXRhQ29uZmlnKClcbiAgICBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKVxuICAgIGxldCBib2R5ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgcHJvY2Vzc05vZGUoYm9keSlcbiAgICBjb25zdCByZXN0b3JlZEVsdHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIltoeC10cmlnZ2VyPSdyZXN0b3JlZCddLFtkYXRhLWh4LXRyaWdnZXI9J3Jlc3RvcmVkJ11cIlxuICAgIClcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWJvcnQnLCBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXRcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YSh0YXJnZXQpXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhICYmIGludGVybmFsRGF0YS54aHIpIHtcbiAgICAgICAgaW50ZXJuYWxEYXRhLnhoci5hYm9ydCgpXG4gICAgICB9XG4gICAgfSlcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIGNvbnN0IG9yaWdpbmFsUG9wc3RhdGUgPSB3aW5kb3cub25wb3BzdGF0ZSA/IHdpbmRvdy5vbnBvcHN0YXRlLmJpbmQod2luZG93KSA6IG51bGxcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5zdGF0ZSAmJiBldmVudC5zdGF0ZS5odG14KSB7XG4gICAgICAgIHJlc3RvcmVIaXN0b3J5KClcbiAgICAgICAgZm9yRWFjaChyZXN0b3JlZEVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnJlc3RvcmVkJywge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGdldERvY3VtZW50KCksXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsUG9wc3RhdGUpIHtcbiAgICAgICAgICBvcmlnaW5hbFBvcHN0YXRlKGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoYm9keSwgJ2h0bXg6bG9hZCcsIHt9KSAvLyBnaXZlIHJlYWR5IGhhbmRsZXJzIGEgY2hhbmNlIHRvIGxvYWQgdXAgYmVmb3JlIGZpcmluZyB0aGlzIGV2ZW50XG4gICAgICBib2R5ID0gbnVsbCAvLyBraWxsIHJlZmVyZW5jZSBmb3IgZ2NcbiAgICB9LCAwKVxuICB9KVxuXG4gIHJldHVybiBodG14XG59KSgpXG5cbi8qKiBAdHlwZWRlZiB7J2dldCd8J2hlYWQnfCdwb3N0J3wncHV0J3wnZGVsZXRlJ3wnY29ubmVjdCd8J29wdGlvbnMnfCd0cmFjZSd8J3BhdGNoJ30gSHR0cFZlcmIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2FwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdE9PQl1cbiAqIEBwcm9wZXJ0eSB7Kn0gW2V2ZW50SW5mb11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYW5jaG9yXVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbY29udGV4dEVsZW1lbnRdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU3dhcENhbGxiYWNrXVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclNldHRsZUNhbGxiYWNrXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHN3YXBDYWxsYmFja1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeydpbm5lckhUTUwnIHwgJ291dGVySFRNTCcgfCAnYmVmb3JlYmVnaW4nIHwgJ2FmdGVyYmVnaW4nIHwgJ2JlZm9yZWVuZCcgfCAnYWZ0ZXJlbmQnIHwgJ2RlbGV0ZScgfCAnbm9uZScgfCBzdHJpbmd9IEh0bXhTd2FwU3R5bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEh0bXhTd2FwU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzd2FwRGVsYXlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZXR0bGVEZWxheVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJhbnNpdGlvbl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoZWFkXVxuICogQHByb3BlcnR5IHsndG9wJyB8ICdib3R0b20nfSBbc2Nyb2xsXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JvbGxUYXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3ddXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3dUYXJnZXRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb2N1c1Njcm9sbF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKHRoaXM6Tm9kZSwgZXZ0OkV2ZW50KSA9PiBib29sZWFuKSAmIHtzb3VyY2U6IHN0cmluZ319IENvbmRpdGlvbmFsRnVuY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9sbEludGVydmFsXVxuICogQHByb3BlcnR5IHtDb25kaXRpb25hbEZ1bmN0aW9ufSBbZXZlbnRGaWx0ZXJdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjaGFuZ2VkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbb25jZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnN1bWVdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmcm9tXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Rocm90dGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9vdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyZXNob2xkXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tlbHQ6IEVsZW1lbnQsIG1lc3NhZ2U6IHN0cmluZywgdmFsaWRpdHk6IFZhbGlkaXR5U3RhdGV9fSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gSFgtUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlclxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlci1OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UYXJnZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIWC1DdXJyZW50LVVSTFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtIWC1Qcm9tcHRdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUJvb3N0ZWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0NvbnRlbnQtVHlwZV1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3RdXG4gKi9cblxuLyoqIEB0eXBlZGVmIEh0bXhBamF4SGVscGVyQ29udGV4dFxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3NvdXJjZV1cbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IFtldmVudF1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlVXJsUGFyYW1zXG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHBhcmFtZXRlcnMgZm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IHVuZmlsdGVyZWRGb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHVuZmlsdGVyZWRQYXJhbWV0ZXJzIHVuZmlsdGVyZWRGb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn0gaGVhZGVyc1xuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEBwcm9wZXJ0eSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpdGhDcmVkZW50aWFsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoXG4gKiBAcHJvcGVydHkge0V2ZW50fSB0cmlnZ2VyaW5nRXZlbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUluZm9cbiAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhFdGN9IGV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VsZWN0XG4gKiBAcHJvcGVydHkge3tyZXF1ZXN0UGF0aDogc3RyaW5nLCBmaW5hbFJlcXVlc3RQYXRoOiBzdHJpbmcsIHJlc3BvbnNlUGF0aDogc3RyaW5nfG51bGwsIGFuY2hvcjogc3RyaW5nfX0gcGF0aEluZm9cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N1Y2Nlc3NmdWxdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtrZWVwSW5kaWNhdG9yc11cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhBamF4RXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXR1cm5Qcm9taXNlXVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFt0YXJnZXRPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2RlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBzd2FwXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlcnJvcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtldmVudF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIdG14UmVzcG9uc2VJbmZvICYge3Nob3VsZFN3YXA6IGJvb2xlYW4sIHNlcnZlclJlc3BvbnNlOiBhbnksIGlzRXJyb3I6IGJvb2xlYW4sIGlnbm9yZVRpdGxlOiBib29sZWFuLCBzZWxlY3RPdmVycmlkZTpzdHJpbmd9fSBIdG14QmVmb3JlU3dhcERldGFpbHNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBIdG14QWpheEhhbmRsZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygoKSA9PiB2b2lkKX0gSHRteFNldHRsZVRhc2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhTZXR0bGVJbmZvXG4gKiBAcHJvcGVydHkge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gZWx0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aXRsZV1cbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgtZXh0ZW5zaW9ucy9ibG9iL21haW4vUkVBRE1FLm1kXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14RXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkgeyhhcGk6IGFueSkgPT4gdm9pZH0gaW5pdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnR8Q3VzdG9tRXZlbnQpID0+IGJvb2xlYW59IG9uRXZlbnRcbiAqIEBwcm9wZXJ0eSB7KHRleHQ6IHN0cmluZywgeGhyOiBYTUxIdHRwUmVxdWVzdCwgZWx0OiBFbGVtZW50KSA9PiBzdHJpbmd9IHRyYW5zZm9ybVJlc3BvbnNlXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpID0+IGJvb2xlYW59IGlzSW5saW5lU3dhcFxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLCB0YXJnZXQ6IE5vZGUsIGZyYWdtZW50OiBOb2RlLCBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbykgPT4gYm9vbGVhbnxOb2RlW119IGhhbmRsZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHhocjogWE1MSHR0cFJlcXVlc3QsIHBhcmFtZXRlcnM6IEZvcm1EYXRhLCBlbHQ6IE5vZGUpID0+ICp8c3RyaW5nfG51bGx9IGVuY29kZVBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nW118bnVsbH0gZ2V0U2VsZWN0b3JzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGh0bXhcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBkZXBlbmRzT24ocGF0aFNwZWM6IGFueSwgdXJsOiBzdHJpbmcpIHtcbiAgaWYgKHBhdGhTcGVjID09PSBcImlnbm9yZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGRlcGVuZGVuY3lQYXRoID0gcGF0aFNwZWMuc3BsaXQoXCIvXCIpO1xuICBjb25zdCB1cmxQYXRoID0gdXJsLnNwbGl0KFwiL1wiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeUVsZW1lbnQgPSBkZXBlbmRlbmN5UGF0aC5zaGlmdCgpO1xuICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gdXJsUGF0aFtpXTtcbiAgICBpZiAoZGVwZW5kZW5jeUVsZW1lbnQgIT09IHBhdGhFbGVtZW50ICYmIGRlcGVuZGVuY3lFbGVtZW50ICE9PSBcIipcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDAgfHxcbiAgICAgIChkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDEgJiYgZGVwZW5kZW5jeVBhdGhbMF0gPT09IFwiXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgZWx0c1dpdGhEZXBzID0gaHRteC5maW5kQWxsKFwiW3BhdGgtZGVwc11cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0c1dpdGhEZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZWx0ID0gZWx0c1dpdGhEZXBzW2ldO1xuICAgIGlmIChkZXBlbmRzT24oZWx0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSwgcGF0aCkpIHtcbiAgICAgIGh0bXgudHJpZ2dlcihlbHQsIFwicGF0aC1kZXBzXCIsIG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInBhdGgtZGVwc1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmJlZm9yZU9uTG9hZFwiKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBldnQuZGV0YWlsLnJlcXVlc3RDb25maWc7XG4gICAgICAvLyBtdXRhdGluZyBjYWxsXG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZyAmJlxuICAgICAgICBjb25maWcudmVyYiAhPT0gXCJnZXRcIiAmJlxuICAgICAgICBldnQudGFyZ2V0ICE9IG51bGwgJiZcbiAgICAgICAgZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgZXZ0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIikgIT09IFwiaWdub3JlXCJcbiAgICAgICkge1xuICAgICAgICByZWZyZXNoUGF0aChjb25maWcucGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCwge0h0bXhTZXR0bGVJbmZvLCBIdG14U3dhcFN0eWxlfSBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBldmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJztcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLnJlcGxhY2UoXCJoeC1vbjo6XCIsIFwiaHRteDpcIiksIGV2ZW50LmRldGFpbClcbiAgICAgICAgICAgICAgICAgICAgZS5kaXNwYXRjaEV2ZW50KG5ld0V2ZW50KVxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQuYWRkKGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4oZSBhcyBIVE1MRWxlbWVudCwgbmFtZSwgZXZlbnQsIHRyaWdnZXJlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJ0cmlnZ2VyLWNoaWxkcmVuXCIsIHtcbiAgICBvbkV2ZW50OiAobmFtZSwgZXZ0OiBFdmVudCB8IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKGV2dC5kZXRhaWwubWV0YSA9PT0gJ3RyaWdnZXItY2hpbGRyZW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJpZ2dlcmVkID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8fCBldnQuZGV0YWlsLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdHJpZ2dlckNoaWxkcmVuKHRhcmdldCwgbmFtZSwgZXZ0LCB0cmlnZ2VyZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGk6IGFueSk6IHZvaWQge1xuICAgIH0sXG4gICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uIChcbiAgICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgICB4aHI6IFhNTEh0dHBSZXF1ZXN0LFxuICAgICAgICBlbHQ6IEVsZW1lbnQsXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfSxcbiAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uIChzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgaGFuZGxlU3dhcDogZnVuY3Rpb24gKFxuICAgICAgICBzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsXG4gICAgICAgIHRhcmdldDogTm9kZSxcbiAgICAgICAgZnJhZ21lbnQ6IE5vZGUsXG4gICAgICAgIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvLFxuICAgICk6IGJvb2xlYW4gfCBOb2RlW10ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIHBhcmFtZXRlcnM6IEZvcm1EYXRhLFxuICAgICAgICBlbHQ6IE5vZGUsXG4gICAgKSB7XG4gICAgfSxcbiAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uICgpOiBzdHJpbmdbXSB8IG51bGwge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJkZWJ1Z1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmKG5hbWUgIT0gJ2h0bXg6d3NCZWZvcmVNZXNzYWdlJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIGlmIChjb25zb2xlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkRFQlVHOlwiLCBuYW1lLCBldnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub29wXG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmNvbnN0IGNvbmZpZzogYW55ID0gaHRteC5jb25maWc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHRteFwiKS5IdG14SW50ZXJuYWxBcGl9ICovXG5sZXQgYXBpOiBhbnk7XG5cbmNvbnN0IGF0dHJQcmVmaXggPSBcImh4LXRhcmdldC1cIjtcblxuLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgc3RyaW5nLnN0YXJ0c1dpdGhcbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXg7XG59XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0gcmVzcENvZGVOdW1iZXJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9XG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BDb2RlVGFyZ2V0KGVsdDogRWxlbWVudCwgcmVzcENvZGVOdW1iZXI6IG51bWJlcikge1xuICBpZiAoIWVsdCB8fCAhcmVzcENvZGVOdW1iZXIpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJlc3BDb2RlID0gcmVzcENvZGVOdW1iZXIudG9TdHJpbmcoKTtcblxuICAvLyAnKicgaXMgdGhlIG9yaWdpbmFsIHN5bnRheCwgYXMgdGhlIG9idmlvdXMgY2hhcmFjdGVyIGZvciBhIHdpbGRjYXJkLlxuICAvLyBUaGUgJ3gnIGFsdGVybmF0aXZlIHdhcyBhZGRlZCBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IHdpdGggSFRNTFxuICAvLyB0ZW1wbGF0aW5nIGVuZ2luZXMsIGR1ZSB0byBhbWJpZ3VpdHkgYXJvdW5kIHdoaWNoIGNoYXJhY3RlcnMgYXJlXG4gIC8vIHN1cHBvcnRlZCBpbiBIVE1MIGF0dHJpYnV0ZXMuXG4gIC8vXG4gIC8vIFN0YXJ0IHdpdGggdGhlIG1vc3Qgc3BlY2lmaWMgcG9zc2libGUgYXR0cmlidXRlIGFuZCBnZW5lcmFsaXplIGZyb21cbiAgLy8gdGhlcmUuXG4gIGNvbnN0IGF0dHJQb3NzaWJpbGl0aWVzID0gW1xuICAgIHJlc3BDb2RlLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCJ4XCIsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInhcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIioqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4eFwiLFxuXG4gICAgXCIqXCIsXG4gICAgXCJ4XCIsXG4gICAgXCIqKipcIixcbiAgICBcInh4eFwiLFxuICBdO1xuICBpZiAoc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI0XCIpIHx8IHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNVwiKSkge1xuICAgIGF0dHJQb3NzaWJpbGl0aWVzLnB1c2goXCJlcnJvclwiKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clBvc3NpYmlsaXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhdHRyID0gYXR0clByZWZpeCArIGF0dHJQb3NzaWJpbGl0aWVzW2ldO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGFwaS5nZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKTtcbiAgICBpZiAoYXR0clZhbHVlKSB7XG4gICAgICBpZiAoYXR0clZhbHVlID09PSBcInRoaXNcIikge1xuICAgICAgICByZXR1cm4gYXBpLmZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFwaS5xdWVyeVNlbGVjdG9yRXh0KGVsdCwgYXR0clZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEBwYXJhbSB7RXZlbnR9IGV2dCAqL1xuZnVuY3Rpb24gaGFuZGxlRXJyb3JGbGFnKGV2dDogQ3VzdG9tRXZlbnQpIHtcbiAgaWYgKGV2dC5kZXRhaWwuaXNFcnJvcikge1xuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvcikge1xuICAgICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvcikge1xuICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IHRydWU7XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJyZXNwb25zZS10YXJnZXRzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBpbml0OiAoYXBpUmVmKSA9PiB7XG4gICAgYXBpID0gYXBpUmVmO1xuXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbmFtZSA9PT0gXCJodG14OmJlZm9yZVN3YXBcIiAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyAhPT0gMjAwXG4gICAgKSB7XG4gICAgICBpZiAoZXZ0LmRldGFpbC50YXJnZXQpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZykge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciAmJlxuICAgICAgICAgIGV2dC5kZXRhaWwueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLm1hdGNoKC9IWC1SZXRhcmdldDovaSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFldnQuZGV0YWlsLnJlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRSZXNwQ29kZVRhcmdldChcbiAgICAgICAgZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnLmVsdCxcbiAgICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzLFxuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgIGV2dC5kZXRhaWwudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJtdXRhdGlvbi1lcnJvclwiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmFmdGVyUmVxdWVzdFwiKSB7XG4gICAgICBpZiAoIWV2dC5kZXRhaWwgfHwgIWV2dC5kZXRhaWwueGhyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXR1cyA9IGV2dC5kZXRhaWwueGhyLnN0YXR1cztcbiAgICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIGh0bXguZmluZEFsbChcIltoeC1vblxcXFw6XFxcXDptdXRhdGlvbi1lcnJvcl1cIikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBcImh0bXg6bXV0YXRpb24tZXJyb3JcIiwgeyBzdGF0dXMgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQge2NyZWF0ZVdlYlNvY2tldENsaWVudH0gZnJvbSBcIi4uL3V0aWwvd3NcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59IiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmNvbnN0IGV2YWxGdW5jUmVnZXggPS9fX2V2YWxfW0EtWmEtejAtOV0rXFwoW2Etel0rXFwpL2dtXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiaHRtZ29cIiwge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgaWYobmFtZSA9PT0gXCJodG14OmJlZm9yZUNsZWFudXBFbGVtZW50XCIgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICB9XG4gICAgfSxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcylcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgIGNvbnN0IG1hdGNoZXMgPSBhdHRyaWJ1dGUudmFsdWUubWF0Y2goZXZhbEZ1bmNSZWdleCkgfHwgW11cbiAgICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBtYXRjaC5yZXBsYWNlKFwiKClcIiwgXCJcIikucmVwbGFjZShcIih0aGlzKVwiLCBcIlwiKS5yZXBsYWNlKFwiO1wiLCBcIlwiKVxuICAgICAgICAgICAgY29uc3QgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgICAgICBpZihlbGUgJiYgZWxlLnRhZ05hbWUgPT09IFwiU0NSSVBUXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwicmVtb3ZpbmcgYXNzb2NpYXRlZCBzY3JpcHQgd2l0aCBpZFwiLCBpZClcbiAgICAgICAgICAgICAgICBlbGUucmVtb3ZlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gJ2h0bXgub3JnJ1xuaW1wb3J0IHtyZW1vdmVBc3NvY2lhdGVkU2NyaXB0c30gZnJvbSBcIi4vaHRtZ29cIjtcblxuXG5kZWNsYXJlIG1vZHVsZSAnaHRteC5vcmcnIHtcbiAgICBpbnRlcmZhY2UgSHRteCB7XG4gICAgICAgIGRlZmluZUV4dGVuc2lvbihuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogSHRteEV4dGVuc2lvbik6IHZvaWQ7XG4gICAgICAgIGNyZWF0ZVdlYlNvY2tldD86ICh1cmw6IHN0cmluZykgPT4gV2ViU29ja2V0O1xuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgIHdzUmVjb25uZWN0RGVsYXk/OiAnZnVsbC1qaXR0ZXInIHwgKChyZXRyeUNvdW50OiBudW1iZXIpID0+IG51bWJlcik7XG4gICAgICAgICAgICB3c0JpbmFyeVR5cGU/OiBzdHJpbmc7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICAgICAgfTtcbiAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIEh0bXhFeHRlbnNpb24ge1xuICAgIGluaXQ6IChhcGlSZWY6IEh0bXhJbnRlcm5hbEFwaSkgPT4gdm9pZDtcbiAgICBvbkV2ZW50OiAobmFtZTogc3RyaW5nLCBldnQ6IEV2ZW50KSA9PiB2b2lkO1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuaW50ZXJmYWNlIEh0bXhJbnRlcm5hbEFwaSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdDogRWxlbWVudCk6IGFueTtcbiAgICBib2R5Q29udGFpbnMoZWx0OiBFbGVtZW50KTogYm9vbGVhbjtcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQ6IEVsZW1lbnQsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGw7XG4gICAgdHJpZ2dlckV2ZW50KGVsdDogRWxlbWVudCwgbmFtZTogc3RyaW5nLCBkZXRhaWw/OiBhbnkpOiBib29sZWFuO1xuICAgIHdpdGhFeHRlbnNpb25zKGVsdDogRWxlbWVudCwgY2FsbGJhY2s6IChleHRlbnNpb246IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgbWFrZVNldHRsZUluZm8oZWx0OiBFbGVtZW50KTogYW55O1xuICAgIG1ha2VGcmFnbWVudChodG1sOiBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50O1xuICAgIG9vYlN3YXAoc3dhcFN0eWxlOiBzdHJpbmcsIGZyYWdtZW50OiBFbGVtZW50LCBzZXR0bGVJbmZvOiBhbnkpOiB2b2lkO1xuICAgIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzOiBhbnkpOiB2b2lkO1xuICAgIGdldENsb3Nlc3RNYXRjaChlbHQ6IEVsZW1lbnQsIGNvbmRpdGlvbjogKG5vZGU6IEVsZW1lbnQpID0+IGJvb2xlYW4pOiBFbGVtZW50IHwgbnVsbDtcbiAgICBnZXRUcmlnZ2VyU3BlY3MoZWx0OiBFbGVtZW50KTogYW55W107XG4gICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0OiBFbGVtZW50LCB0cmlnZ2VyU3BlYzogYW55LCBub2RlRGF0YTogYW55LCBoYW5kbGVyOiAoZWx0OiBFbGVtZW50LCBldnQ6IEV2ZW50KSA9PiB2b2lkKTogdm9pZDtcbiAgICBnZXRIZWFkZXJzKGVsdDogRWxlbWVudCwgdGFyZ2V0OiBFbGVtZW50KTogYW55O1xuICAgIGdldFRhcmdldChlbHQ6IEVsZW1lbnQpOiBFbGVtZW50O1xuICAgIGdldElucHV0VmFsdWVzKGVsdDogRWxlbWVudCwgdmVyYjogc3RyaW5nKTogeyBlcnJvcnM6IGFueVtdOyB2YWx1ZXM6IGFueSB9O1xuICAgIGdldEV4cHJlc3Npb25WYXJzKGVsdDogRWxlbWVudCk6IGFueTtcbiAgICBtZXJnZU9iamVjdHMob2JqMTogYW55LCBvYmoyOiBhbnkpOiBhbnk7XG4gICAgZmlsdGVyVmFsdWVzKHZhbHVlczogYW55LCBlbHQ6IEVsZW1lbnQpOiBhbnk7XG4gICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0PzogRWxlbWVudCwgbmFtZT86IHN0cmluZywgZGV0YWlsPzogYW55KTogdm9pZDtcbiAgICBoYXNBdHRyaWJ1dGUoZWx0OiBFbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIHNob3VsZENhbmNlbChldnQ6IEV2ZW50LCBlbHQ6IEVsZW1lbnQpOiBib29sZWFuO1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuaW50ZXJmYWNlIFdlYlNvY2tldFdyYXBwZXIge1xuICAgIHNvY2tldDogV2ViU29ja2V0O1xuICAgIGV2ZW50cyA6IHsgW2tleTogc3RyaW5nXTogKChldmVudDogRXZlbnQpID0+IHZvaWQpW10gfTtcbiAgICBtZXNzYWdlUXVldWU6IHsgbWVzc2FnZTogc3RyaW5nOyBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCB9W107XG4gICAgcmV0cnlDb3VudDogbnVtYmVyO1xuICAgIHNlbmRJbW1lZGlhdGVseShtZXNzYWdlOiBzdHJpbmcsIHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsKTogdm9pZDtcbiAgICBzZW5kKG1lc3NhZ2U6IHN0cmluZywgc2VuZEVsdDogRWxlbWVudCB8IG51bGwpOiB2b2lkO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKGV2ZW50OiBFdmVudCkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgaGFuZGxlUXVldWVkTWVzc2FnZXMoKTogdm9pZDtcbiAgICBpbml0KCk6IHZvaWQ7XG4gICAgY2xvc2UoKTogdm9pZDtcbiAgICBwdWJsaWNJbnRlcmZhY2U6IHtcbiAgICAgICAgc2VuZDogKG1lc3NhZ2U6IHN0cmluZywgc2VuZEVsdDogRWxlbWVudCB8IG51bGwpID0+IHZvaWQ7XG4gICAgICAgIHNlbmRJbW1lZGlhdGVseTogKG1lc3NhZ2U6IHN0cmluZywgc2VuZEVsdDogRWxlbWVudCB8IG51bGwpID0+IHZvaWQ7XG4gICAgICAgIHF1ZXVlOiB7IG1lc3NhZ2U6IHN0cmluZzsgc2VuZEVsdDogRWxlbWVudCB8IG51bGwgfVtdO1xuICAgIH07XG59XG5cbmxldCBhcGk6IEh0bXhJbnRlcm5hbEFwaTtcblxuZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xufVxuXG5mdW5jdGlvbiBnZXRMZWdhY3lXZWJzb2NrZXRVUkwoZWx0OiBFbGVtZW50KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsZWdhY3lTU0VWYWx1ZSA9IGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC13cycpO1xuICAgIGlmIChsZWdhY3lTU0VWYWx1ZSkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBzcGxpdE9uV2hpdGVzcGFjZShsZWdhY3lTU0VWYWx1ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tpXS5zcGxpdCgvOiguKykvKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZVswXSA9PT0gJ2Nvbm5lY3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVdlYlNvY2tldChzb2NrZXRFbHQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgLy8gSWYgdGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gbm8gbG9uZ2VyIGV4aXN0cywgdGhlblxuICAgIC8vIGRvIG5vdCBjb25uZWN0L3JlY29ubmVjdCB0aGUgV2ViU29ja2V0LlxuICAgIGlmICghYXBpLmJvZHlDb250YWlucyhzb2NrZXRFbHQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHNvdXJjZSBzdHJhaWdodCBmcm9tIHRoZSBlbGVtZW50J3MgdmFsdWVcbiAgICBsZXQgd3NzU291cmNlID0gYXBpLmdldEF0dHJpYnV0ZVZhbHVlKHNvY2tldEVsdCwgJ3dzLWNvbm5lY3QnKTtcblxuICAgIGlmICh3c3NTb3VyY2UgPT0gbnVsbCB8fCB3c3NTb3VyY2UgPT09ICcnKSB7XG4gICAgICAgIGNvbnN0IGxlZ2FjeVNvdXJjZSA9IGdldExlZ2FjeVdlYnNvY2tldFVSTChzb2NrZXRFbHQpO1xuICAgICAgICBpZiAobGVnYWN5U291cmNlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdzc1NvdXJjZSA9IGxlZ2FjeVNvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEd1YXJhbnRlZSB0aGF0IHRoZSB3c3NTb3VyY2UgdmFsdWUgaXMgYSBmdWxseSBxdWFsaWZpZWQgVVJMXG4gICAgaWYgKHdzc1NvdXJjZS5pbmRleE9mKCcvJykgPT09IDApIHtcbiAgICAgICAgY29uc3QgYmFzZV9wYXJ0ID0gbG9jYXRpb24uaG9zdG5hbWUgKyAobG9jYXRpb24ucG9ydCA/ICc6JyArIGxvY2F0aW9uLnBvcnQgOiAnJyk7XG4gICAgICAgIGlmIChsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgICAgICAgIHdzc1NvdXJjZSA9ICd3c3M6Ly8nICsgYmFzZV9wYXJ0ICsgd3NzU291cmNlO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cDonKSB7XG4gICAgICAgICAgICB3c3NTb3VyY2UgPSAnd3M6Ly8nICsgYmFzZV9wYXJ0ICsgd3NzU291cmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc29ja2V0V3JhcHBlciA9IGNyZWF0ZVdlYnNvY2tldFdyYXBwZXIoc29ja2V0RWx0LCAoKSA9PiBodG14LmNyZWF0ZVdlYlNvY2tldCEod3NzU291cmNlKSk7XG5cbiAgICBzb2NrZXRXcmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKG1heWJlQ2xvc2VXZWJTb2NrZXRTb3VyY2Uoc29ja2V0RWx0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlID0gKGV2ZW50IGFzIE1lc3NhZ2VFdmVudCkuZGF0YTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWFwaS50cmlnZ2VyRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c0JlZm9yZU1lc3NhZ2UnLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgc29ja2V0V3JhcHBlcjogc29ja2V0V3JhcHBlci5wdWJsaWNJbnRlcmZhY2UsXG4gICAgICAgICAgICB9KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwaS53aXRoRXh0ZW5zaW9ucyhzb2NrZXRFbHQsIChleHRlbnNpb24pID0+IHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHJlc3BvbnNlLCBudWxsLCBzb2NrZXRFbHQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gYXBpLm1ha2VTZXR0bGVJbmZvKHNvY2tldEVsdCk7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSk7XG5cbiAgICAgICAgaWYgKGZyYWdtZW50LmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldXG4gICAgICAgICAgICAgICAgYXBpLm9vYlN3YXAoYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGNoaWxkLCAnaHgtc3dhcC1vb2InKSB8fCAndHJ1ZScsIGNoaWxkcmVuW2ldLCBzZXR0bGVJbmZvKTtcbiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGh0bWdvIGV2YWxfXyBzY3JpcHRzXG4gICAgICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgY2hpbGQuaWQuc3RhcnRzV2l0aChcIl9fZXZhbFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhcGkuc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcyk7XG4gICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c0FmdGVyTWVzc2FnZScsIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLFxuICAgICAgICAgICAgc29ja2V0V3JhcHBlcjogc29ja2V0V3JhcHBlci5wdWJsaWNJbnRlcmZhY2UsXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gUHV0IHRoZSBXZWJTb2NrZXQgaW50byB0aGUgSFRNTCBFbGVtZW50J3MgY3VzdG9tIGRhdGEuXG4gICAgYXBpLmdldEludGVybmFsRGF0YShzb2NrZXRFbHQpLndlYlNvY2tldCA9IHNvY2tldFdyYXBwZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVdlYnNvY2tldFdyYXBwZXIoc29ja2V0RWx0OiBIVE1MRWxlbWVudCwgc29ja2V0RnVuYzogKCkgPT4gV2ViU29ja2V0KTogV2ViU29ja2V0V3JhcHBlciB7XG4gICAgY29uc3Qgd3JhcHBlcjogV2ViU29ja2V0V3JhcHBlciA9IHtcbiAgICAgICAgc29ja2V0OiBudWxsIGFzIHVua25vd24gYXMgV2ViU29ja2V0LFxuICAgICAgICBtZXNzYWdlUXVldWU6IFtdLFxuICAgICAgICByZXRyeUNvdW50OiAwLFxuICAgICAgICBldmVudHM6IHt9IGFzIHsgW2tleTogc3RyaW5nXTogKChldmVudDogRXZlbnQpID0+IHZvaWQpW10gfSxcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmV2ZW50c1tldmVudF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50c1tldmVudF0gPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ldmVudHNbZXZlbnRdLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH0sXG4gICAgICAgIHNlbmRJbW1lZGlhdGVseShtZXNzYWdlOiBzdHJpbmcsIHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc29ja2V0KSB7XG4gICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFcnJvckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NFcnJvcicsIHsgZXJyb3I6ICdObyBzb2NrZXQgYXZhaWxhYmxlJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhc2VuZEVsdCB8fFxuICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoc2VuZEVsdCwgJ2h0bXg6d3NCZWZvcmVTZW5kJywge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBzb2NrZXRXcmFwcGVyOiB0aGlzLnB1YmxpY0ludGVyZmFjZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VuZEVsdCkge1xuICAgICAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckV2ZW50KHNlbmRFbHQsICdodG14OndzQWZ0ZXJTZW5kJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldFdyYXBwZXI6IHRoaXMucHVibGljSW50ZXJmYWNlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNlbmQobWVzc2FnZTogc3RyaW5nLCBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT09IHRoaXMuc29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VRdWV1ZS5wdXNoKHsgbWVzc2FnZSwgc2VuZEVsdCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kSW1tZWRpYXRlbHkobWVzc2FnZSwgc2VuZEVsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGhhbmRsZVF1ZXVlZE1lc3NhZ2VzKCkge1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMubWVzc2FnZVF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZWRJdGVtID0gdGhpcy5tZXNzYWdlUXVldWVbMF07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kSW1tZWRpYXRlbHkocXVldWVkSXRlbS5tZXNzYWdlLCBxdWV1ZWRJdGVtLnNlbmRFbHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xvc2UgZGlzY2FyZGVkIHNvY2tldFxuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBXZWJTb2NrZXQgYW5kIGV2ZW50IGhhbmRsZXJzXG4gICAgICAgICAgICBjb25zdCBzb2NrZXQgPSBzb2NrZXRGdW5jKCk7XG5cbiAgICAgICAgICAgIC8vIFRoZSBldmVudC50eXBlIGRldGFpbCBpcyBhZGRlZCBmb3IgaW50ZXJmYWNlIGNvbmZvcm1hbmNlIHdpdGggdGhlXG4gICAgICAgICAgICAvLyBvdGhlciB0d28gbGlmZWN5Y2xlIGV2ZW50cyAob3BlbiBhbmQgY2xvc2UpIHNvIGEgc2luZ2xlIGhhbmRsZXIgbWV0aG9kXG4gICAgICAgICAgICAvLyBjYW4gaGFuZGxlIHRoZW0gcG9seW1vcnBoaWNhbGx5LCBpZiByZXF1aXJlZC5cbiAgICAgICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c0Nvbm5lY3RpbmcnLCB7IGV2ZW50OiB7IHR5cGU6ICdjb25uZWN0aW5nJyB9IH0pO1xuXG4gICAgICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcblxuICAgICAgICAgICAgc29ja2V0Lm9ub3BlbiA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXRyeUNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NPcGVuJywgeyBldmVudDogZSwgc29ja2V0V3JhcHBlcjogdGhpcy5wdWJsaWNJbnRlcmZhY2UgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVRdWV1ZWRNZXNzYWdlcygpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIElmIHNvY2tldCBzaG91bGQgbm90IGJlIGNvbm5lY3RlZCwgc3RvcCBmdXJ0aGVyIGF0dGVtcHRzIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgLy8gSWYgQWJub3JtYWwgQ2xvc3VyZS9TZXJ2aWNlIFJlc3RhcnQvVHJ5IEFnYWluIExhdGVyLCB0aGVuIHNldCBhIHRpbWVyIHRvIHJlY29ubmVjdCBhZnRlciBhIHBhdXNlLlxuICAgICAgICAgICAgICAgIGlmICghbWF5YmVDbG9zZVdlYlNvY2tldFNvdXJjZShzb2NrZXRFbHQpICYmIFsxMDA2LCAxMDEyLCAxMDEzXS5pbmRleE9mKGUuY29kZSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxheSA9IGdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KHRoaXMucmV0cnlDb3VudCk7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXRyeUNvdW50ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5vdGlmeSBjbGllbnQgY29kZSB0aGF0IGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkLiBDbGllbnQgY29kZSBjYW4gaW5zcGVjdCBgZXZlbnRgIGZpZWxkXG4gICAgICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgY2xvc3VyZSBoYXMgYmVlbiB2YWxpZCBvciBhYm5vcm1hbFxuICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c0Nsb3NlJywgeyBldmVudDogZSwgc29ja2V0V3JhcHBlcjogdGhpcy5wdWJsaWNJbnRlcmZhY2UgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzb2NrZXQub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFcnJvckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NFcnJvcicsIHsgZXJyb3I6IGUsIHNvY2tldFdyYXBwZXI6IHRoaXMgfSk7XG4gICAgICAgICAgICAgICAgbWF5YmVDbG9zZVdlYlNvY2tldFNvdXJjZShzb2NrZXRFbHQpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5ldmVudHM7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhldmVudHMpLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgICAgICAgICBldmVudHNba10uZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihrLCBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbG9zZSgpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHB1YmxpY0ludGVyZmFjZToge30gYXMgYW55LFxuICAgIH07XG5cbiAgICB3cmFwcGVyLmluaXQoKTtcblxuICAgIHdyYXBwZXIucHVibGljSW50ZXJmYWNlID0ge1xuICAgICAgICBzZW5kOiB3cmFwcGVyLnNlbmQuYmluZCh3cmFwcGVyKSxcbiAgICAgICAgc2VuZEltbWVkaWF0ZWx5OiB3cmFwcGVyLnNlbmRJbW1lZGlhdGVseS5iaW5kKHdyYXBwZXIpLFxuICAgICAgICBxdWV1ZTogd3JhcHBlci5tZXNzYWdlUXVldWUsXG4gICAgfTtcblxuICAgIHJldHVybiB3cmFwcGVyO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVXZWJTb2NrZXRTZW5kKGVsdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBsZWdhY3lBdHRyaWJ1dGUgPSBhcGkuZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtd3MnKTtcbiAgICBpZiAobGVnYWN5QXR0cmlidXRlICYmIGxlZ2FjeUF0dHJpYnV0ZSAhPT0gJ3NlbmQnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJTb2NrZXRQYXJlbnQgPSBhcGkuZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgaGFzV2ViU29ja2V0KTtcbiAgICBpZiAod2ViU29ja2V0UGFyZW50KSB7XG4gICAgICAgIHByb2Nlc3NXZWJTb2NrZXRTZW5kKHdlYlNvY2tldFBhcmVudCBhcyBIVE1MRWxlbWVudCwgZWx0KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGhhc1dlYlNvY2tldChub2RlOiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhcGkuZ2V0SW50ZXJuYWxEYXRhKG5vZGUpLndlYlNvY2tldCAhPSBudWxsO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzV2ViU29ja2V0U2VuZChzb2NrZXRFbHQ6IEhUTUxFbGVtZW50LCBzZW5kRWx0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gYXBpLmdldEludGVybmFsRGF0YShzZW5kRWx0KTtcbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBhcGkuZ2V0VHJpZ2dlclNwZWNzKHNlbmRFbHQpO1xuICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKCh0cykgPT4ge1xuICAgICAgICBhcGkuYWRkVHJpZ2dlckhhbmRsZXIoc2VuZEVsdCwgdHMsIG5vZGVEYXRhLCAoZWx0OiBFbGVtZW50LCBldnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAobWF5YmVDbG9zZVdlYlNvY2tldFNvdXJjZShzb2NrZXRFbHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb2NrZXRXcmFwcGVyOiBXZWJTb2NrZXRXcmFwcGVyID0gYXBpLmdldEludGVybmFsRGF0YShzb2NrZXRFbHQpLndlYlNvY2tldDtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBhcGkuZ2V0SGVhZGVycyhzZW5kRWx0LCBhcGkuZ2V0VGFyZ2V0KHNlbmRFbHQpKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhcGkuZ2V0SW5wdXRWYWx1ZXMoc2VuZEVsdCwgJ3Bvc3QnKTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3VsdHMuZXJyb3JzO1xuICAgICAgICAgICAgY29uc3QgcmF3UGFyYW1ldGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHJlc3VsdHMudmFsdWVzKTtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gYXBpLmdldEV4cHJlc3Npb25WYXJzKHNlbmRFbHQpO1xuICAgICAgICAgICAgY29uc3QgYWxsUGFyYW1ldGVycyA9IGFwaS5tZXJnZU9iamVjdHMocmF3UGFyYW1ldGVycywgZXhwcmVzc2lvblZhcnMpO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRQYXJhbWV0ZXJzID0gYXBpLmZpbHRlclZhbHVlcyhhbGxQYXJhbWV0ZXJzLCBzZW5kRWx0KTtcblxuICAgICAgICAgICAgY29uc3Qgc2VuZENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBmaWx0ZXJlZFBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGFsbFBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICBlcnJvcnMsXG5cbiAgICAgICAgICAgICAgICB0cmlnZ2VyaW5nRXZlbnQ6IGV2dCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlQm9keTogdW5kZWZpbmVkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzb2NrZXRXcmFwcGVyOiBzb2NrZXRXcmFwcGVyLnB1YmxpY0ludGVyZmFjZSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICghYXBpLnRyaWdnZXJFdmVudChlbHQsICdodG14OndzQ29uZmlnU2VuZCcsIHNlbmRDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgZXJyb3JzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBib2R5ID0gc2VuZENvbmZpZy5tZXNzYWdlQm9keTtcbiAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b1NlbmQgPSBPYmplY3QuYXNzaWduKHt9LCBzZW5kQ29uZmlnLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgIGlmIChzZW5kQ29uZmlnLmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9TZW5kLkhFQURFUlMgPSBoZWFkZXJzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkodG9TZW5kKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc29ja2V0V3JhcHBlci5zZW5kKGJvZHksIGVsdCBhcyBFbGVtZW50KTtcblxuICAgICAgICAgICAgaWYgKGV2dCAmJiBhcGkuc2hvdWxkQ2FuY2VsKGV2dCwgZWx0IGFzIEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheShyZXRyeUNvdW50OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGRlbGF5ID0gaHRteC5jb25maWcud3NSZWNvbm5lY3REZWxheTtcbiAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBkZWxheShyZXRyeUNvdW50KTtcbiAgICB9XG4gICAgaWYgKGRlbGF5ID09PSAnZnVsbC1qaXR0ZXInKSB7XG4gICAgICAgIGNvbnN0IGV4cCA9IE1hdGgubWluKHJldHJ5Q291bnQsIDYpO1xuICAgICAgICBjb25zdCBtYXhEZWxheSA9IDEwMDAgKiBNYXRoLnBvdygyLCBleHApO1xuICAgICAgICByZXR1cm4gbWF4RGVsYXkgKiBNYXRoLnJhbmRvbSgpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gbWF5YmVDbG9zZVdlYlNvY2tldFNvdXJjZShlbHQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKCFhcGkuYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgYXBpLmdldEludGVybmFsRGF0YShlbHQpLndlYlNvY2tldC5jbG9zZSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXQodXJsOiBzdHJpbmcpOiBXZWJTb2NrZXQge1xuICAgIGNvbnN0IHNvY2sgPSBuZXcgV2ViU29ja2V0KHVybCwgW10pO1xuICAgIHNvY2suYmluYXJ5VHlwZSA9IChodG14LmNvbmZpZy53c0JpbmFyeVR5cGUgfHwgJ2Jsb2InKSBhcyB1bmtub3duIGFzIEJpbmFyeVR5cGU7XG4gICAgcmV0dXJuIHNvY2s7XG59XG5cbmZ1bmN0aW9uIHF1ZXJ5QXR0cmlidXRlT25UaGlzT3JDaGlsZHJlbihlbHQ6IEhUTUxFbGVtZW50LCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudFtdIHtcbiAgICBjb25zdCByZXN1bHQ6IEhUTUxFbGVtZW50W10gPSBbXTtcblxuICAgIC8vIElmIHRoZSBwYXJlbnQgZWxlbWVudCBhbHNvIGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlLCB0aGVuIGFkZCBpdCB0byB0aGUgcmVzdWx0cyB0b28uXG4gICAgaWYgKGFwaS5oYXNBdHRyaWJ1dGUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB8fCBhcGkuaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXdzJykpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZWx0KTtcbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggYWxsIGNoaWxkIG5vZGVzIHRoYXQgbWF0Y2ggdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVcbiAgICBlbHQucXVlcnlTZWxlY3RvckFsbCgnWycgKyBhdHRyaWJ1dGVOYW1lICsgJ10sIFtkYXRhLScgKyBhdHRyaWJ1dGVOYW1lICsgJ10sIFtkYXRhLWh4LXdzXSwgW2h4LXdzXScpLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgcmVzdWx0LnB1c2gobm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JFYWNoPFQ+KGFycjogVFtdLCBmdW5jOiAoaXRlbTogVCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmIChhcnIpIHtcbiAgICAgICAgYXJyLmZvckVhY2goZnVuYyk7XG4gICAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbignd3MnLCB7XG4gICAgaW5pdDogKGFwaVJlZjogSHRteEludGVybmFsQXBpKSA9PiB7XG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSB0byBpbnRlcm5hbCBBUElcbiAgICAgICAgYXBpID0gYXBpUmVmO1xuXG4gICAgICAgIC8vIERlZmF1bHQgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIG5ldyBXZWJTb2NrZXQgb2JqZWN0c1xuICAgICAgICBpZiAoIWh0bXguY3JlYXRlV2ViU29ja2V0KSB7XG4gICAgICAgICAgICBodG14LmNyZWF0ZVdlYlNvY2tldCA9IGNyZWF0ZVdlYlNvY2tldDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgc2V0dGluZyBmb3IgcmVjb25uZWN0IGRlbGF5XG4gICAgICAgIGlmICghaHRteC5jb25maWcud3NSZWNvbm5lY3REZWxheSkge1xuICAgICAgICAgICAgaHRteC5jb25maWcud3NSZWNvbm5lY3REZWxheSA9ICdmdWxsLWppdHRlcic7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgb25FdmVudDogKG5hbWU6IHN0cmluZywgZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBwYXJlbnQ6IEVsZW1lbnQgPSBldnQudGFyZ2V0IGFzIEVsZW1lbnQgfHwgKGV2dCBhcyBDdXN0b21FdmVudCkuZGV0YWlsLmVsdDtcblxuICAgICAgICBpZighKHBhcmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBjbG9zZSB0aGUgc29ja2V0IHdoZW4gZWxlbWVudHMgYXJlIHJlbW92ZWRcbiAgICAgICAgICAgIGNhc2UgJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnOlxuICAgICAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gYXBpLmdldEludGVybmFsRGF0YShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbERhdGEud2ViU29ja2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGludGVybmFsRGF0YS53ZWJTb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIHdlYnNvY2tldHMgd2hlbiBlbGVtZW50cyBhcmUgcHJvY2Vzc2VkXG4gICAgICAgICAgICBjYXNlICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJzpcbiAgICAgICAgICAgICAgICBmb3JFYWNoKHF1ZXJ5QXR0cmlidXRlT25UaGlzT3JDaGlsZHJlbihwYXJlbnQsICd3cy1jb25uZWN0JyksIChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbnN1cmVXZWJTb2NrZXQoY2hpbGQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZvckVhY2gocXVlcnlBdHRyaWJ1dGVPblRoaXNPckNoaWxkcmVuKHBhcmVudCwgJ3dzLXNlbmQnKSwgKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVuc3VyZVdlYlNvY2tldFNlbmQoY2hpbGQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3BhdGhkZXBzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3RyaWdnZXItY2hpbGRyZW5cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvZGVidWdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcmVzcG9uc2UtdGFyZ2V0c1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9tdXRhdGlvbi1lcnJvclwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkXCJcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvaHRtZ29cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvd3NcIlxuXG5mdW5jdGlvbiB3YXRjaFVybChjYWxsYmFjazogKG9sZFVybDogc3RyaW5nLCBuZXdVcmw6IHN0cmluZykgPT4gdm9pZCkge1xuICBsZXQgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBsYXN0VXJsKSB7XG4gICAgICBjYWxsYmFjayhsYXN0VXJsLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuICB9LCAxMDApO1xufVxuXG53YXRjaFVybCgoXywgbmV3VXJsKSA9PiB7XG4gIG9uVXJsQ2hhbmdlKG5ld1VybCk7XG59KTtcblxuZnVuY3Rpb24gb25VcmxDaGFuZ2UobmV3VXJsOiBzdHJpbmcpIHtcbiAgbGV0IHVybCA9IG5ldyBVUkwobmV3VXJsKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXJdXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtdHJpZ2dlclwiKTtcbiAgICBpZiAoIXRyaWdnZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gdHJpZ2dlcnMuc3BsaXQoXCIsIFwiKTtcbiAgICBpZiAoc3BsaXQuZmluZCgocykgPT4gcyA9PT0gXCJ1cmxcIikpIHtcbiAgICAgIGh0bXguc3dhcChlbGVtZW50LCBcInVybFwiLCB7XG4gICAgICAgIHN3YXBTdHlsZTogXCJvdXRlckhUTUxcIixcbiAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZXNdIG9mIHVybC5zZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgbGV0IGV2ZW50TmFtZSA9IFwicXM6XCIgKyBrZXk7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5pbmNsdWRlcyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0cmlnZ2VyaW5nXCIsIGV2ZW50TmFtZSk7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIGV2ZW50TmFtZSwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtbWF0Y2gtcXBdXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBlbC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIikpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5yZXBsYWNlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiwgXCJcIik7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KG1hdGNoKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgaHRteC5zd2FwKGVsLCBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgPz8gXCJcIiwge1xuICAgICAgICAgICAgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLFxuICAgICAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGFzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzTWF0Y2gpIHtcbiAgICAgIGxldCBkZWZhdWx0S2V5ID0gZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtZGVmYXVsdFwiKTtcbiAgICAgIGlmIChkZWZhdWx0S2V5KSB7XG4gICAgICAgIGh0bXguc3dhcChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiICsgZGVmYXVsdEtleSkgPz8gXCJcIixcbiAgICAgICAgICB7IHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIiwgc3dhcERlbGF5OiAwLCBzZXR0bGVEZWxheTogMCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy93cy50cyIsIi4uL2pzL2h0bWdvLnRzIl0sIm5hbWVzIjpbImh0bXgiLCJlbHQiLCJ0eXBlIiwidmVyYiIsInRhZyIsImdsb2JhbCIsInN0ciIsImludGVydmFsIiwibmFtZSIsInF1YWxpZmllZE5hbWUiLCJwYXJlbnQiLCJjb25kaXRpb24iLCJpbml0aWFsRWxlbWVudCIsImFuY2VzdG9yIiwiYXR0cmlidXRlTmFtZSIsImF0dHJpYnV0ZVZhbHVlIiwiZGlzaW5oZXJpdCIsImluaGVyaXQiLCJjbG9zZXN0QXR0ciIsImUiLCJzZWxlY3RvciIsIm1hdGNoZXNGdW5jdGlvbiIsIm1hdGNoIiwicmVzcCIsImZyYWdtZW50Iiwic2NyaXB0IiwibmV3U2NyaXB0IiwiYXR0ciIsInJlc3BvbnNlIiwicmVzcG9uc2VXaXRoTm9IZWFkIiwic3RhcnRUYWciLCJkb2MiLCJ0aXRsZUVsZW1lbnQiLCJmdW5jIiwibyIsImRhdGFQcm9wIiwiZGF0YSIsImFyciIsInJldHVybkFyciIsImkiLCJlbCIsInJlY3QiLCJlbGVtVG9wIiwiZWxlbUJvdHRvbSIsInJvb3ROb2RlIiwidHJpZ2dlciIsIm9iajEiLCJvYmoyIiwia2V5IiwialN0cmluZyIsImVycm9yIiwidGVzdCIsInBhdGgiLCJ1cmwiLCJjYWxsYmFjayIsImV2dCIsImV2ZW50IiwiZWx0T3JTZWxlY3RvciIsImRlbGF5IiwidmFsdWUiLCJjbGF6eiIsIm5vZGUiLCJjaGlsZCIsInByZWZpeCIsInN1ZmZpeCIsInRyaW1tZWRTZWxlY3RvciIsInN0YXJ0IiwicmVzdWx0cyIsImNvbnRleHQiLCJhcmcxIiwiYXJnMiIsImFyZzMiLCJldmVudEFyZ3MiLCJhdHRyTmFtZSIsImF0dHJUYXJnZXQiLCJyZXN1bHQiLCJhdHRyaWJ1dGUiLCJ0YXJnZXRTdHIiLCJhdHRyaWJ1dGVzVG9TZXR0bGUiLCJtZXJnZVRvIiwibWVyZ2VGcm9tIiwic3dhcFN0eWxlIiwidGFyZ2V0IiwiZXh0ZW5zaW9ucyIsImV4dGVuc2lvbiIsIm9vYlZhbHVlIiwib29iRWxlbWVudCIsInNldHRsZUluZm8iLCJ0YXJnZXRzIiwib29iRWxlbWVudENsb25lIiwiYmVmb3JlU3dhcERldGFpbHMiLCJwcmVzZXJ2ZWRFbHQiLCJpZCIsIm9sZEVsdCIsInBhcmVudE5vZGUiLCJuZXdOb2RlIiwibm9ybWFsaXplZElkIiwibm9ybWFsaXplZFRhZyIsInBhcmVudEVsdCIsIm9sZE5vZGUiLCJuZXdBdHRyaWJ1dGVzIiwiYXV0b2ZvY3VzIiwiYXV0b0ZvY3VzZWRFbHQiLCJpbnNlcnRCZWZvcmUiLCJzdHJpbmciLCJoYXNoIiwiY2hhciIsImludGVybmFsRGF0YSIsImhhbmRsZXJJbmZvIiwiZWxlbWVudCIsImluZm8iLCJuZXdFbHQiLCJlbHRCZWZvcmVOZXdDb250ZW50IiwiZmlyc3RDaGlsZCIsImV4dCIsIm5ld0VsZW1lbnRzIiwiaiIsIm9vYkVsdHMiLCJjb250ZW50Iiwic3dhcFNwZWMiLCJzd2FwT3B0aW9ucyIsImFjdGl2ZUVsdCIsInNlbGVjdGlvbkluZm8iLCJvb2JTZWxlY3RWYWx1ZXMiLCJvb2JTZWxlY3RWYWx1ZSIsInRlbXBsYXRlIiwibmV3RnJhZ21lbnQiLCJuZXdBY3RpdmVFbHQiLCJmb2N1c09wdGlvbnMiLCJkb1NldHRsZSIsInRhc2siLCJhbmNob3JUYXJnZXQiLCJ4aHIiLCJoZWFkZXIiLCJ0cmlnZ2VyQm9keSIsInRyaWdnZXJzIiwiZXZlbnROYW1lIiwiZGV0YWlsIiwiZXZlbnROYW1lcyIsInRva2VucyIsInBvc2l0aW9uIiwic3RhcnRQb3NpdGlvbiIsInN0YXJ0Q2hhciIsInN5bWJvbCIsInRva2VuIiwibGFzdCIsInBhcmFtTmFtZSIsImJyYWNrZXRDb3VudCIsImNvbmRpdGlvbmFsU291cmNlIiwiY29uZGl0aW9uRnVuY3Rpb24iLCJleHBsaWNpdFRyaWdnZXIiLCJjYWNoZSIsInRyaWdnZXJTcGVjcyIsImluaXRpYWxMZW5ndGgiLCJldmVyeSIsImV2ZW50RmlsdGVyIiwidHJpZ2dlclNwZWMiLCJmcm9tX2FyZyIsImhhbmRsZXIiLCJzcGVjIiwibm9kZURhdGEiLCJyYXdBdHRyaWJ1dGUiLCJzb3VyY2UiLCJleHBsaWNpdENhbmNlbCIsImVsZW1lbnREYXRhIiwiZWx0c1RvTGlzdGVuT24iLCJlbHRUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbkRhdGEiLCJldmVudExpc3RlbmVyIiwiZXZlbnREYXRhIiwibG9hZCIsImV4cGxpY2l0QWN0aW9uIiwib2JzZXJ2ZXJPcHRpb25zIiwiZW50cmllcyIsImF0dHJpYnV0ZXMiLCJlbGVtZW50cyIsIml0ZXIiLCJib29zdGVkU2VsZWN0b3IiLCJleHRlbnNpb25TZWxlY3RvcnMiLCJzZWxlY3RvcnMiLCJzIiwiZm9ybSIsImNvZGUiLCJsaXN0ZW5lciIsImFmdGVyT25Qb3NpdGlvbiIsIm5leHRDaGFyIiwidG9EbyIsIm1zZyIsImV2ZW50UmVzdWx0Iiwia2ViYWJOYW1lIiwia2ViYWJlZEV2ZW50Iiwicm9vdEVsdCIsImlubmVySFRNTCIsInRpdGxlIiwic2Nyb2xsIiwiaGlzdG9yeUNhY2hlIiwibmV3SGlzdG9yeUl0ZW0iLCJjbGFzc05hbWUiLCJjbG9uZSIsImRpc2FibGVIaXN0b3J5Q2FjaGUiLCJ0YXNrcyIsInJlcXVlc3QiLCJkZXRhaWxzIiwiaGlzdG9yeUVsZW1lbnQiLCJjYWNoZWQiLCJpbmRpY2F0b3JzIiwiaWMiLCJkaXNhYmxlZEVsdHMiLCJkaXNhYmxlZEVsZW1lbnQiLCJkaXNhYmxlZCIsInByb2Nlc3NlZCIsImZvcm1EYXRhIiwidiIsInZhbHVlcyIsImVycm9ycyIsInZhbGlkYXRlIiwiaW5wdXQiLCJyZWNlaXZlciIsImRvbm9yIiwicHJpb3JpdHlGb3JtRGF0YSIsImJ1dHRvbiIsImluY2x1ZGVzIiwiZGVzY2VuZGFudCIsInJldHVyblN0ciIsInJlYWxWYWx1ZSIsInByb21wdCIsImhlYWRlcnMiLCJpbnB1dFZhbHVlcyIsInBhcmFtc1ZhbHVlIiwibmV3VmFsdWVzIiwic3dhcEluZm9PdmVycmlkZSIsInN3YXBJbmZvIiwic3BsaXQiLCJzcGxpdFNwZWMiLCJzY3JvbGxWYWwiLCJzZWxlY3RvclZhbCIsInNob3dWYWwiLCJmb2N1c1Njcm9sbFZhbCIsImZpbHRlcmVkUGFyYW1ldGVycyIsImVuY29kZWRQYXJhbWV0ZXJzIiwiZmlyc3QiLCJldmFsQXNEZWZhdWx0IiwiZXZhbHVhdGVWYWx1ZSIsInZhcnNWYWx1ZXMiLCJ0b0V2YWwiLCJkZWZhdWx0VmFsIiwiZXhwcmVzc2lvblZhcnMiLCJoZWFkZXJWYWx1ZSIsInJlZ2V4cCIsInJlcXVlc3RDb25maWciLCJzYW1lSG9zdCIsIm9iaiIsImFycmF5IiwiaW5kZXgiLCJwcm9wIiwiZXRjIiwiY29uZmlybWVkIiwicmVzb2x2ZSIsInJlamVjdCIsInByb21pc2UiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJyZXNwb25zZUhhbmRsZXIiLCJzZWxlY3QiLCJlbHREYXRhIiwic3VibWl0dGVyIiwiYnV0dG9uUGF0aCIsImJ1dHRvblZlcmIiLCJjb25maXJtUXVlc3Rpb24iLCJza2lwQ29uZmlybWF0aW9uIiwic3luY0VsdCIsInN5bmNTdHJhdGVneSIsInF1ZXVlU3RyYXRlZ3kiLCJhYm9ydGFibGUiLCJzeW5jU3RyaW5ncyIsImVuZFJlcXVlc3RMb2NrIiwicHJvbXB0UXVlc3Rpb24iLCJwcm9tcHRSZXNwb25zZSIsInJhd0Zvcm1EYXRhIiwiYWxsRm9ybURhdGEiLCJmaWx0ZXJlZEZvcm1EYXRhIiwicmVxdWVzdEF0dHJWYWx1ZXMiLCJlbHRJc0Jvb3N0ZWQiLCJ1c2VVcmxQYXJhbXMiLCJzcGxpdFBhdGgiLCJwYXRoTm9BbmNob3IiLCJhbmNob3IiLCJmaW5hbFBhdGgiLCJyZXNwb25zZUluZm8iLCJoaWVyYXJjaHkiLCJkaXNhYmxlRWx0cyIsInNlY29uZGFyeVRyaWdnZXJFbHQiLCJwYXJlbnRFbHRJbkhpZXJhcmNoeSIsInBhcmFtcyIsInBhdGhGcm9tSGVhZGVycyIsInR5cGVGcm9tSGVhZGVycyIsInJlcXVlc3RQYXRoIiwicmVzcG9uc2VQYXRoIiwicHVzaFVybCIsInJlcGxhY2VVcmwiLCJlbGVtZW50SXNCb29zdGVkIiwic2F2ZVR5cGUiLCJyZXNwb25zZUhhbmRsaW5nQ29uZmlnIiwic3RhdHVzIiwicmVnRXhwIiwicmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQiLCJ0aXRsZUVsdCIsInJlc3BvbnNlSW5mb1NlbGVjdCIsInJlZGlyZWN0UGF0aCIsInJlZGlyZWN0U3dhcFNwZWMiLCJzaG91bGRSZWZyZXNoIiwiaGlzdG9yeVVwZGF0ZSIsInJlc3BvbnNlSGFuZGxpbmciLCJzaG91bGRTd2FwIiwiaXNFcnJvciIsImlnbm9yZVRpdGxlIiwic2VsZWN0T3ZlcnJpZGUiLCJzd2FwT3ZlcnJpZGUiLCJzZXJ2ZXJSZXNwb25zZSIsInNldHRsZVJlc29sdmUiLCJzZXR0bGVSZWplY3QiLCJzZWxlY3RPT0IiLCJkb1N3YXAiLCJmaW5hbEVsdCIsInNob3VsZFRyYW5zaXRpb24iLCJzZXR0bGVQcm9taXNlIiwiaW5uZXJEb1N3YXAiLCJhcGkiLCJ0ZXh0IiwicGFyYW1ldGVycyIsImV4dGVuc2lvbnNUb1JldHVybiIsImV4dGVuc2lvbnNUb0lnbm9yZSIsImV4dGVuc2lvbnNGb3JFbGVtZW50IiwiZXh0ZW5zaW9uTmFtZSIsImZuIiwibm9uY2VBdHRyaWJ1dGUiLCJtZXRhQ29uZmlnIiwiYm9keSIsInJlc3RvcmVkRWx0cyIsIm9yaWdpbmFsUG9wc3RhdGUiLCJodG14X2VzbV9kZWZhdWx0IiwiZGVwZW5kc09uIiwicGF0aFNwZWMiLCJkZXBlbmRlbmN5UGF0aCIsInVybFBhdGgiLCJkZXBlbmRlbmN5RWxlbWVudCIsInBhdGhFbGVtZW50IiwicmVmcmVzaFBhdGgiLCJlbHRzV2l0aERlcHMiLCJjb25maWciLCJrZWJhYkV2ZW50TmFtZSIsIm1ha2VFdmVudCIsInRyaWdnZXJDaGlsZHJlbiIsInRyaWdnZXJlZCIsIm5ld0V2ZW50IiwiYXR0clByZWZpeCIsInN0YXJ0c1dpdGgiLCJnZXRSZXNwQ29kZVRhcmdldCIsInJlc3BDb2RlTnVtYmVyIiwicmVzcENvZGUiLCJhdHRyUG9zc2liaWxpdGllcyIsImF0dHJWYWx1ZSIsImhhbmRsZUVycm9yRmxhZyIsImFwaVJlZiIsImxhc3RWZXJzaW9uIiwiZW5hYmxlZCIsImV2ZW50U291cmNlIiwibWVzc2FnZSIsInJlbG9hZCIsImV2YWxGdW5jUmVnZXgiLCJyZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyIsIm1hdGNoZXMiLCJlbGUiLCJzcGxpdE9uV2hpdGVzcGFjZSIsImdldExlZ2FjeVdlYnNvY2tldFVSTCIsImxlZ2FjeVNTRVZhbHVlIiwiZW5zdXJlV2ViU29ja2V0Iiwic29ja2V0RWx0Iiwid3NzU291cmNlIiwibGVnYWN5U291cmNlIiwiYmFzZV9wYXJ0Iiwic29ja2V0V3JhcHBlciIsImNyZWF0ZVdlYnNvY2tldFdyYXBwZXIiLCJjcmVhdGVXZWJTb2NrZXQiLCJtYXliZUNsb3NlV2ViU29ja2V0U291cmNlIiwiY2hpbGRyZW4iLCJzb2NrZXRGdW5jIiwid3JhcHBlciIsInNlbmRFbHQiLCJxdWV1ZWRJdGVtIiwic29ja2V0IiwiZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkiLCJldmVudHMiLCJrIiwiZW5zdXJlV2ViU29ja2V0U2VuZCIsImxlZ2FjeUF0dHJpYnV0ZSIsIndlYlNvY2tldFBhcmVudCIsImhhc1dlYlNvY2tldCIsInByb2Nlc3NXZWJTb2NrZXRTZW5kIiwidHMiLCJyYXdQYXJhbWV0ZXJzIiwiYWxsUGFyYW1ldGVycyIsInNlbmRDb25maWciLCJ0b1NlbmQiLCJyZXRyeUNvdW50IiwiZXhwIiwic29jayIsInF1ZXJ5QXR0cmlidXRlT25UaGlzT3JDaGlsZHJlbiIsImZvckVhY2giLCJ3YXRjaFVybCIsImxhc3RVcmwiLCJfIiwibmV3VXJsIiwib25VcmxDaGFuZ2UiLCJoYXNNYXRjaCIsImRlZmF1bHRLZXkiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLEVBQUFBLENBQVEsVUFBVyxDQUlyQixJQUFNLElBQU8sQ0FBQSxDQUlYLE9BQVEsSUFFUixDQUFBLE9BQUEsQ0FBUyxLQUVULEVBQUksQ0FBQSxJQUFBLENBRUosSUFBSyxJQUVMLENBQUEsT0FBQSxDQUFTLEtBRVQsSUFBTSxDQUFBLElBQUEsQ0FHTixJQUFNLENBQUEsSUFBQSxDQUVOLE9BQVMsQ0FBQSxJQUFBLENBRVQsUUFBUyxJQVVULENBQUEsTUFBQSxDQUFRLFNBQVNDLENBQUtDLENBQUFBLENBQUFBLENBQU0sQ0FFMUIsT0FEb0IsY0FBQSxDQUFlRCxDQUFLQyxDQUFBQSxDQUFBQSxFQUFRLE1BQU0sQ0FBQSxDQUNuQyxNQUNyQixDQUdBLENBQUEsTUFBQSxDQUFRLEtBRVIsUUFBVSxDQUFBLElBQUEsQ0FFVixZQUFhLElBRWIsQ0FBQSxXQUFBLENBQWEsSUFFYixDQUFBLFNBQUEsQ0FBVyxJQUVYLENBQUEsSUFBQSxDQUFNLEtBR04sZUFBaUIsQ0FBQSxJQUFBLENBRWpCLGdCQUFpQixJQUdqQixDQUFBLE1BQUEsQ0FBUSxLQUVSLE9BQVMsQ0FBQSxJQUFBLENBT1QsTUFBUSxDQUFBLElBQUEsQ0FRUixNQUFRLENBQUEsQ0FNTixlQUFnQixDQU1oQixDQUFBLENBQUEsZ0JBQUEsQ0FBa0IsR0FLbEIsb0JBQXNCLENBQUEsQ0FBQSxDQUFBLENBTXRCLGlCQUFrQixXQU1sQixDQUFBLGdCQUFBLENBQWtCLENBTWxCLENBQUEsa0JBQUEsQ0FBb0IsRUFNcEIsQ0FBQSxzQkFBQSxDQUF3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QUFxQixDQUFBLENBQ2xEdVgsR0FDRjNFLENBQUssQ0FBQSxJQUFBLENBQ0g1UyxFQUNBQSxDQUFHLENBQUEsWUFBQSxDQUFhLHNCQUF5QnVYLENBQUFBLENBQVUsQ0FBSyxFQUFBLEVBQUEsQ0FDeEQsQ0FBRSxTQUFXLENBQUEsV0FBQSxDQUFhLFVBQVcsQ0FBRyxDQUFBLFdBQUEsQ0FBYSxDQUFFLENBQ3pELEVBRUosQ0FDRixDQUFDLEVBQ0giLCJmaWxlIjoiaHRtZ28uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaHRteCA9IChmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnXG5cbiAgLy8gUHVibGljIEFQSVxuICBjb25zdCBodG14ID0ge1xuICAgIC8vIFRzYyBtYWRuZXNzIGhlcmUsIGFzc2lnbmluZyB0aGUgZnVuY3Rpb25zIGRpcmVjdGx5IHJlc3VsdHMgaW4gYW4gaW52YWxpZCBUeXBlU2NyaXB0IG91dHB1dCwgYnV0IHJlYXNzaWduaW5nIGlzIGZpbmVcbiAgICAvKiBFdmVudCBwcm9jZXNzaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygb25Mb2FkSGVscGVyfSAqL1xuICAgIG9uTG9hZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwcm9jZXNzTm9kZX0gKi9cbiAgICBwcm9jZXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZEV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9mZjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0cmlnZ2VyRXZlbnR9ICovXG4gICAgdHJpZ2dlcjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhamF4SGVscGVyfSAqL1xuICAgIGFqYXg6IG51bGwsXG4gICAgLyogRE9NIHF1ZXJ5aW5nIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kfSAqL1xuICAgIGZpbmQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZEFsbH0gKi9cbiAgICBmaW5kQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGNsb3Nlc3R9ICovXG4gICAgY2xvc2VzdDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbnB1dCB2YWx1ZXMgdGhhdCB3b3VsZCByZXNvbHZlIGZvciBhIGdpdmVuIGVsZW1lbnQgdmlhIHRoZSBodG14IHZhbHVlIHJlc29sdXRpb24gbWVjaGFuaXNtXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN2YWx1ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0IHRoZSBlbGVtZW50IHRvIHJlc29sdmUgdmFsdWVzIG9uXG4gICAgICogQHBhcmFtIHtIdHRwVmVyYn0gdHlwZSB0aGUgcmVxdWVzdCB0eXBlIChlLmcuICoqZ2V0Kiogb3IgKipwb3N0KiopIG5vbi1HRVQncyB3aWxsIGluY2x1ZGUgdGhlIGVuY2xvc2luZyBmb3JtIG9mIHRoZSBlbGVtZW50LiBEZWZhdWx0cyB0byAqKnBvc3QqKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgdmFsdWVzOiBmdW5jdGlvbihlbHQsIHR5cGUpIHtcbiAgICAgIGNvbnN0IGlucHV0VmFsdWVzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB0eXBlIHx8ICdwb3N0JylcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlcy52YWx1ZXNcbiAgICB9LFxuICAgIC8qIERPTSBtYW5pcHVsYXRpb24gaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZENsYXNzVG9FbGVtZW50fSAqL1xuICAgIGFkZENsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdG9nZ2xlQ2xhc3NPbkVsZW1lbnR9ICovXG4gICAgdG9nZ2xlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdGFrZUNsYXNzRm9yRWxlbWVudH0gKi9cbiAgICB0YWtlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygc3dhcH0gKi9cbiAgICBzd2FwOiBudWxsLFxuICAgIC8qIEV4dGVuc2lvbiBlbnRyeXBvaW50cyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGRlZmluZUV4dGVuc2lvbn0gKi9cbiAgICBkZWZpbmVFeHRlbnNpb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXh0ZW5zaW9ufSAqL1xuICAgIHJlbW92ZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dBbGx9ICovXG4gICAgbG9nQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ05vbmV9ICovXG4gICAgbG9nTm9uZTogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKipcbiAgICAgKiBUaGUgbG9nZ2VyIGh0bXggdXNlcyB0byBsb2cgd2l0aFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nZ2VyXG4gICAgICovXG4gICAgbG9nZ2VyOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHkgaG9sZGluZyB0aGUgY29uZmlndXJhdGlvbiBodG14IHVzZXMgYXQgcnVudGltZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB1c2luZyBhIFttZXRhIHRhZ10oaHR0cHM6Ly9odG14Lm9yZy9kb2NzLyNjb25maWcpIGlzIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHRoZXNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjb25maWdcbiAgICAgKi9cbiAgICBjb25maWc6IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byB1c2UgaGlzdG9yeS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUVuYWJsZWQ6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8ga2VlcCBpbiAqKmxvY2FsU3RvcmFnZSoqIGZvciBoaXN0b3J5IHN1cHBvcnQuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlDYWNoZVNpemU6IDEwLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICByZWZyZXNoT25IaXN0b3J5TWlzczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IHN3YXAgc3R5bGUgdG8gdXNlIGlmICoqW2h4LXN3YXBdKGh0dHBzOi8vaHRteC5vcmcvYXR0cmlidXRlcy9oeC1zd2FwKSoqIGlzIG9taXR0ZWQuXG4gICAgICAgKiBAdHlwZSBIdG14U3dhcFN0eWxlXG4gICAgICAgKiBAZGVmYXVsdCAnaW5uZXJIVE1MJ1xuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcFN0eWxlOiAnaW5uZXJIVE1MJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiByZWNlaXZpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGRvaW5nIHRoZSBzd2FwLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwRGVsYXk6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gY29tcGxldGluZyB0aGUgY29udGVudCBzd2FwIGFuZCBzZXR0bGluZyBhdHRyaWJ1dGVzLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U2V0dGxlRGVsYXk6IDIwLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0cnVlLCBodG14IHdpbGwgaW5qZWN0IGEgc21hbGwgYW1vdW50IG9mIENTUyBpbnRvIHRoZSBwYWdlIHRvIG1ha2UgaW5kaWNhdG9ycyBpbnZpc2libGUgdW5sZXNzIHRoZSAqKmh0bXgtaW5kaWNhdG9yKiogY2xhc3MgaXMgcHJlc2VudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaW5jbHVkZUluZGljYXRvclN0eWxlczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIGluZGljYXRvcnMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1pbmRpY2F0b3InXG4gICAgICAgKi9cbiAgICAgIGluZGljYXRvckNsYXNzOiAnaHRteC1pbmRpY2F0b3InLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdHJpZ2dlcmluZyBlbGVtZW50cyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXJlcXVlc3QnXG4gICAgICAgKi9cbiAgICAgIHJlcXVlc3RDbGFzczogJ2h0bXgtcmVxdWVzdCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byB0ZW1wb3JhcmlseSBwbGFjZSBvbiBlbGVtZW50cyB0aGF0IGh0bXggaGFzIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWFkZGVkJ1xuICAgICAgICovXG4gICAgICBhZGRlZENsYXNzOiAnaHRteC1hZGRlZCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc2V0dGxpbmcnXG4gICAgICAgKi9cbiAgICAgIHNldHRsaW5nQ2xhc3M6ICdodG14LXNldHRsaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHN3YXBwaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zd2FwcGluZydcbiAgICAgICAqL1xuICAgICAgc3dhcHBpbmdDbGFzczogJ2h0bXgtc3dhcHBpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvd3MgdGhlIHVzZSBvZiBldmFsLWxpa2UgZnVuY3Rpb25hbGl0eSBpbiBodG14LCB0byBlbmFibGUgKipoeC12YXJzKiosIHRyaWdnZXIgY29uZGl0aW9ucyAmIHNjcmlwdCB0YWcgZXZhbHVhdGlvbi4gQ2FuIGJlIHNldCB0byAqKmZhbHNlKiogZm9yIENTUCBjb21wYXRpYmlsaXR5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd0V2YWw6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byBmYWxzZSwgZGlzYWJsZXMgdGhlIGludGVycHJldGF0aW9uIG9mIHNjcmlwdCB0YWdzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd1NjcmlwdFRhZ3M6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHNjcmlwdHMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVNjcmlwdE5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc3R5bGVzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTdHlsZU5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGF0dHJpYnV0ZXMgdG8gc2V0dGxlIGR1cmluZyB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgICAgICogQGRlZmF1bHQgWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXVxuICAgICAgICovXG4gICAgICBhdHRyaWJ1dGVzVG9TZXR0bGU6IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93IGNyb3NzLXNpdGUgQWNjZXNzLUNvbnRyb2wgcmVxdWVzdHMgdXNpbmcgY3JlZGVudGlhbHMgc3VjaCBhcyBjb29raWVzLCBhdXRob3JpemF0aW9uIGhlYWRlcnMgb3IgVExTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgdGltZW91dDogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgKipnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheSoqIGZvciByZWNvbm5lY3RpbmcgYWZ0ZXIgdW5leHBlY3RlZCBjb25uZWN0aW9uIGxvc3MgYnkgdGhlIGV2ZW50IGNvZGUgKipBYm5vcm1hbCBDbG9zdXJlKiosICoqU2VydmljZSBSZXN0YXJ0Kiogb3IgKipUcnkgQWdhaW4gTGF0ZXIqKi5cbiAgICAgICAqIEB0eXBlIHsnZnVsbC1qaXR0ZXInIHwgKChyZXRyeUNvdW50Om51bWJlcikgPT4gbnVtYmVyKX1cbiAgICAgICAqIEBkZWZhdWx0IFwiZnVsbC1qaXR0ZXJcIlxuICAgICAgICovXG4gICAgICB3c1JlY29ubmVjdERlbGF5OiAnZnVsbC1qaXR0ZXInLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdHlwZSBvZiBiaW5hcnkgZGF0YSBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICogQHR5cGUgQmluYXJ5VHlwZVxuICAgICAgICogQGRlZmF1bHQgJ2Jsb2InXG4gICAgICAgKi9cbiAgICAgIHdzQmluYXJ5VHlwZTogJ2Jsb2InLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJ1xuICAgICAgICovXG4gICAgICBkaXNhYmxlU2VsZWN0b3I6ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgeydhdXRvJyB8ICdpbnN0YW50JyB8ICdzbW9vdGgnfVxuICAgICAgICogQGRlZmF1bHQgJ2luc3RhbnQnXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoZSBmb2N1c2VkIGVsZW1lbnQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdmlldy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRGb2N1c1Njcm9sbDogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBpbmNsdWRlIGEgY2FjaGUtYnVzdGluZyBwYXJhbWV0ZXIgaW4gR0VUIHJlcXVlc3RzIHRvIGF2b2lkIGNhY2hpbmcgcGFydGlhbCByZXNwb25zZXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdldENhY2hlQnVzdGVyUGFyYW06IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgaHRteCB3aWxsIHVzZSB0aGUgVmlldyBUcmFuc2l0aW9uIEFQSSB3aGVuIHN3YXBwaW5nIGluIG5ldyBjb250ZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2xvYmFsVmlld1RyYW5zaXRpb25zOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogaHRteCB3aWxsIGZvcm1hdCByZXF1ZXN0cyB3aXRoIHRoZXNlIG1ldGhvZHMgYnkgZW5jb2RpbmcgdGhlaXIgcGFyYW1ldGVycyBpbiB0aGUgVVJMLCBub3QgdGhlIHJlcXVlc3QgYm9keVxuICAgICAgICogQHR5cGUgeyhIdHRwVmVyYilbXX1cbiAgICAgICAqIEBkZWZhdWx0IFsnZ2V0JywgJ2RlbGV0ZSddXG4gICAgICAgKi9cbiAgICAgIG1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zOiBbJ2dldCcsICdkZWxldGUnXSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGRpc2FibGVzIGh0bXgtYmFzZWQgcmVxdWVzdHMgdG8gbm9uLW9yaWdpbiBob3N0cy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHNlbGZSZXF1ZXN0c09ubHk6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBub3QgdXBkYXRlIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQgd2hlbiBhIHRpdGxlIHRhZyBpcyBmb3VuZCBpbiBuZXcgY29udGVudFxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgaWdub3JlVGl0bGU6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgb2YgYSBib29zdGVkIGVsZW1lbnQgaXMgc2Nyb2xsZWQgaW50byB0aGUgdmlld3BvcnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEludG9WaWV3T25Cb29zdDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNhY2hlIHRvIHN0b3JlIGV2YWx1YXRlZCB0cmlnZ2VyIHNwZWNpZmljYXRpb25zIGludG8uXG4gICAgICAgKiBZb3UgbWF5IGRlZmluZSBhIHNpbXBsZSBvYmplY3QgdG8gdXNlIGEgbmV2ZXItY2xlYXJpbmcgY2FjaGUsIG9yIGltcGxlbWVudCB5b3VyIG93biBzeXN0ZW0gdXNpbmcgYSBbcHJveHkgb2JqZWN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSlcbiAgICAgICAqIEB0eXBlIHtPYmplY3R8bnVsbH1cbiAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAqL1xuICAgICAgdHJpZ2dlclNwZWNzQ2FjaGU6IG51bGwsXG4gICAgICAvKiogQHR5cGUgYm9vbGVhbiAqL1xuICAgICAgZGlzYWJsZUluaGVyaXRhbmNlOiBmYWxzZSxcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1tdICovXG4gICAgICByZXNwb25zZUhhbmRsaW5nOiBbXG4gICAgICAgIHsgY29kZTogJzIwNCcsIHN3YXA6IGZhbHNlIH0sXG4gICAgICAgIHsgY29kZTogJ1syM10uLicsIHN3YXA6IHRydWUgfSxcbiAgICAgICAgeyBjb2RlOiAnWzQ1XS4uJywgc3dhcDogZmFsc2UsIGVycm9yOiB0cnVlIH1cbiAgICAgIF0sXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gcHJvY2VzcyBPT0Igc3dhcHMgb24gZWxlbWVudHMgdGhhdCBhcmUgbmVzdGVkIHdpdGhpbiB0aGUgbWFpbiByZXNwb25zZSBlbGVtZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd05lc3RlZE9vYlN3YXBzOiB0cnVlXG4gICAgfSxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwYXJzZUludGVydmFsfSAqL1xuICAgIHBhcnNlSW50ZXJ2YWw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgaW50ZXJuYWxFdmFsfSAqL1xuICAgIF86IG51bGwsXG4gICAgdmVyc2lvbjogJzIuMC4yJ1xuICB9XG4gIC8vIFRzYyBtYWRuZXNzIHBhcnQgMlxuICBodG14Lm9uTG9hZCA9IG9uTG9hZEhlbHBlclxuICBodG14LnByb2Nlc3MgPSBwcm9jZXNzTm9kZVxuICBodG14Lm9uID0gYWRkRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC5vZmYgPSByZW1vdmVFdmVudExpc3RlbmVySW1wbFxuICBodG14LnRyaWdnZXIgPSB0cmlnZ2VyRXZlbnRcbiAgaHRteC5hamF4ID0gYWpheEhlbHBlclxuICBodG14LmZpbmQgPSBmaW5kXG4gIGh0bXguZmluZEFsbCA9IGZpbmRBbGxcbiAgaHRteC5jbG9zZXN0ID0gY2xvc2VzdFxuICBodG14LnJlbW92ZSA9IHJlbW92ZUVsZW1lbnRcbiAgaHRteC5hZGRDbGFzcyA9IGFkZENsYXNzVG9FbGVtZW50XG4gIGh0bXgucmVtb3ZlQ2xhc3MgPSByZW1vdmVDbGFzc0Zyb21FbGVtZW50XG4gIGh0bXgudG9nZ2xlQ2xhc3MgPSB0b2dnbGVDbGFzc09uRWxlbWVudFxuICBodG14LnRha2VDbGFzcyA9IHRha2VDbGFzc0ZvckVsZW1lbnRcbiAgaHRteC5zd2FwID0gc3dhcFxuICBodG14LmRlZmluZUV4dGVuc2lvbiA9IGRlZmluZUV4dGVuc2lvblxuICBodG14LnJlbW92ZUV4dGVuc2lvbiA9IHJlbW92ZUV4dGVuc2lvblxuICBodG14LmxvZ0FsbCA9IGxvZ0FsbFxuICBodG14LmxvZ05vbmUgPSBsb2dOb25lXG4gIGh0bXgucGFyc2VJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWxcbiAgaHRteC5fID0gaW50ZXJuYWxFdmFsXG5cbiAgY29uc3QgaW50ZXJuYWxBUEkgPSB7XG4gICAgYWRkVHJpZ2dlckhhbmRsZXIsXG4gICAgYm9keUNvbnRhaW5zLFxuICAgIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSxcbiAgICBmaW5kVGhpc0VsZW1lbnQsXG4gICAgZmlsdGVyVmFsdWVzLFxuICAgIHN3YXAsXG4gICAgaGFzQXR0cmlidXRlLFxuICAgIGdldEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0TWF0Y2gsXG4gICAgZ2V0RXhwcmVzc2lvblZhcnMsXG4gICAgZ2V0SGVhZGVycyxcbiAgICBnZXRJbnB1dFZhbHVlcyxcbiAgICBnZXRJbnRlcm5hbERhdGEsXG4gICAgZ2V0U3dhcFNwZWNpZmljYXRpb24sXG4gICAgZ2V0VHJpZ2dlclNwZWNzLFxuICAgIGdldFRhcmdldCxcbiAgICBtYWtlRnJhZ21lbnQsXG4gICAgbWVyZ2VPYmplY3RzLFxuICAgIG1ha2VTZXR0bGVJbmZvLFxuICAgIG9vYlN3YXAsXG4gICAgcXVlcnlTZWxlY3RvckV4dCxcbiAgICBzZXR0bGVJbW1lZGlhdGVseSxcbiAgICBzaG91bGRDYW5jZWwsXG4gICAgdHJpZ2dlckV2ZW50LFxuICAgIHRyaWdnZXJFcnJvckV2ZW50LFxuICAgIHdpdGhFeHRlbnNpb25zXG4gIH1cblxuICBjb25zdCBWRVJCUyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCddXG4gIGNvbnN0IFZFUkJfU0VMRUNUT1IgPSBWRVJCUy5tYXAoZnVuY3Rpb24odmVyYikge1xuICAgIHJldHVybiAnW2h4LScgKyB2ZXJiICsgJ10sIFtkYXRhLWh4LScgKyB2ZXJiICsgJ10nXG4gIH0pLmpvaW4oJywgJylcblxuICBjb25zdCBIRUFEX1RBR19SRUdFWCA9IG1ha2VUYWdSZWdFeCgnaGVhZCcpXG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXRpbGl0aWVzXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge1JlZ0V4cH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VUYWdSZWdFeCh0YWcsIGdsb2JhbCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYDwke3RhZ30oXFxcXHNbXj5dKj58PikoW1xcXFxzXFxcXFNdKj8pPFxcXFwvJHt0YWd9PmAsXG4gICAgICBnbG9iYWwgPyAnZ2ltJyA6ICdpbScpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIGludGVydmFsIHN0cmluZyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBodG14IGRvZXMuIFVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IGhhdmUgdGltaW5nLXJlbGF0ZWQgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQ2F1dGlvbjogQWNjZXB0cyBhbiBpbnQgZm9sbG93ZWQgYnkgZWl0aGVyICoqcyoqIG9yICoqbXMqKi4gQWxsIG90aGVyIHZhbHVlcyB1c2UgKipwYXJzZUZsb2F0KipcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcGFyc2VJbnRlcnZhbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRpbWluZyBzdHJpbmdcbiAgICogQHJldHVybnMge251bWJlcnx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUludGVydmFsKHN0cikge1xuICAgIGlmIChzdHIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgbGV0IGludGVydmFsID0gTmFOXG4gICAgaWYgKHN0ci5zbGljZSgtMikgPT0gJ21zJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMikpXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdzJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMFxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAnbScpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDAgKiA2MFxuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNOYU4oaW50ZXJ2YWwpID8gdW5kZWZpbmVkIDogaW50ZXJ2YWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmF3QXR0cmlidXRlKGVsdCwgbmFtZSkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGVsdC5nZXRBdHRyaWJ1dGUobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIC8vIHJlc29sdmUgd2l0aCBib3RoIGh4IGFuZCBkYXRhLWh4IHByZWZpeGVzXG4gIGZ1bmN0aW9uIGhhc0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gISFlbHQuaGFzQXR0cmlidXRlICYmIChlbHQuaGFzQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpIHx8XG4gICAgICBlbHQuaGFzQXR0cmlidXRlKCdkYXRhLScgKyBxdWFsaWZpZWROYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuIGdldFJhd0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHx8IGdldFJhd0F0dHJpYnV0ZShlbHQsICdkYXRhLScgKyBxdWFsaWZpZWROYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudEVsdChlbHQpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIGlmICghcGFyZW50ICYmIGVsdC5wYXJlbnROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkgcmV0dXJuIGVsdC5wYXJlbnROb2RlXG4gICAgcmV0dXJuIHBhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICAgIHJldHVybiBkb2N1bWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtOb2RlfERvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Um9vdE5vZGUoZWx0LCBnbG9iYWwpIHtcbiAgICByZXR1cm4gZWx0LmdldFJvb3ROb2RlID8gZWx0LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IGdsb2JhbCB9KSA6IGdldERvY3VtZW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0geyhlOk5vZGUpID0+IGJvb2xlYW59IGNvbmRpdGlvblxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0TWF0Y2goZWx0LCBjb25kaXRpb24pIHtcbiAgICB3aGlsZSAoZWx0ICYmICFjb25kaXRpb24oZWx0KSkge1xuICAgICAgZWx0ID0gcGFyZW50RWx0KGVsdClcbiAgICB9XG5cbiAgICByZXR1cm4gZWx0IHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGluaXRpYWxFbGVtZW50XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gYW5jZXN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoaW5pdGlhbEVsZW1lbnQsIGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBkaXNpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1kaXNpbmhlcml0JylcbiAgICB2YXIgaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtaW5oZXJpdCcpXG4gICAgaWYgKGluaXRpYWxFbGVtZW50ICE9PSBhbmNlc3Rvcikge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmRpc2FibGVJbmhlcml0YW5jZSkge1xuICAgICAgICBpZiAoaW5oZXJpdCAmJiAoaW5oZXJpdCA9PT0gJyonIHx8IGluaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpc2luaGVyaXQgJiYgKGRpc2luaGVyaXQgPT09ICcqJyB8fCBkaXNpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICByZXR1cm4gJ3Vuc2V0J1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBsZXQgY2xvc2VzdEF0dHIgPSBudWxsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuICEhKGNsb3Nlc3RBdHRyID0gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoZWx0LCBhc0VsZW1lbnQoZSksIGF0dHJpYnV0ZU5hbWUpKVxuICAgIH0pXG4gICAgaWYgKGNsb3Nlc3RBdHRyICE9PSAndW5zZXQnKSB7XG4gICAgICByZXR1cm4gY2xvc2VzdEF0dHJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMgZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRWYXJpYWJsZVxuICAgIGNvbnN0IG1hdGNoZXNGdW5jdGlvbiA9IGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgKGVsdC5tYXRjaGVzIHx8IGVsdC5tYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWx0LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbHQub01hdGNoZXNTZWxlY3RvcilcbiAgICByZXR1cm4gISFtYXRjaGVzRnVuY3Rpb24gJiYgbWF0Y2hlc0Z1bmN0aW9uLmNhbGwoZWx0LCBzZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdGFydFRhZyhzdHIpIHtcbiAgICBjb25zdCB0YWdNYXRjaGVyID0gLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pXG4gICAgY29uc3QgbWF0Y2ggPSB0YWdNYXRjaGVyLmV4ZWMoc3RyKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSFRNTChyZXNwKSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpXG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcCwgJ3RleHQvaHRtbCcpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBlbHQpIHtcbiAgICB3aGlsZSAoZWx0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsdC5jaGlsZE5vZGVzWzBdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge0hUTUxTY3JpcHRFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZHVwbGljYXRlU2NyaXB0KHNjcmlwdCkge1xuICAgIGNvbnN0IG5ld1NjcmlwdCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICBmb3JFYWNoKHNjcmlwdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBuZXdTY3JpcHQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICB9KVxuICAgIG5ld1NjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdC50ZXh0Q29udGVudFxuICAgIG5ld1NjcmlwdC5hc3luYyA9IGZhbHNlXG4gICAgaWYgKGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlKSB7XG4gICAgICBuZXdTY3JpcHQubm9uY2UgPSBodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZVxuICAgIH1cbiAgICByZXR1cm4gbmV3U2NyaXB0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpIHtcbiAgICByZXR1cm4gc2NyaXB0Lm1hdGNoZXMoJ3NjcmlwdCcpICYmIChzY3JpcHQudHlwZSA9PT0gJ3RleHQvamF2YXNjcmlwdCcgfHwgc2NyaXB0LnR5cGUgPT09ICdtb2R1bGUnIHx8IHNjcmlwdC50eXBlID09PSAnJylcbiAgfVxuXG4gIC8qKlxuICAgKiB3ZSBoYXZlIHRvIG1ha2UgbmV3IGNvcGllcyBvZiBzY3JpcHQgdGFncyB0aGF0IHdlIGFyZSBnb2luZyB0byBpbnNlcnQgYmVjYXVzZVxuICAgKiBTT01FIGJyb3dzZXJzIChub3Qgc2F5aW5nIHdobywgYnV0IGl0IGludm9sdmVzIGFuIGVsZW1lbnQgYW5kIGFuIGFuaW1hbCkgZG9uJ3RcbiAgICogZXhlY3V0ZSBzY3JpcHRzIGNyZWF0ZWQgaW4gPHRlbXBsYXRlPiB0YWdzIHdoZW4gdGhleSBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXG4gICAqIGFuZCBhbGwgdGhlIG90aGVycyBkbyBsbWFvXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpIHtcbiAgICBBcnJheS5mcm9tKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpKS5mb3JFYWNoKC8qKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHQgKi8gKHNjcmlwdCkgPT4ge1xuICAgICAgaWYgKGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSkge1xuICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBzY3JpcHQucGFyZW50Tm9kZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3U2NyaXB0LCBzY3JpcHQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7RG9jdW1lbnRGcmFnbWVudCAmIHt0aXRsZT86IHN0cmluZ319IERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGVcbiAgICogQGRlc2NyaXB0aW9uICBhIGRvY3VtZW50IGZyYWdtZW50IHJlcHJlc2VudGluZyB0aGUgcmVzcG9uc2UgSFRNTCwgaW5jbHVkaW5nXG4gICAqIGEgYHRpdGxlYCBwcm9wZXJ0eSBmb3IgYW55IHRpdGxlIGluZm9ybWF0aW9uIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2UgSFRNTFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VGcmFnbWVudChyZXNwb25zZSkge1xuICAgIC8vIHN0cmlwIGhlYWQgdGFnIHRvIGRldGVybWluZSBzaGFwZSBvZiByZXNwb25zZSB3ZSBhcmUgZGVhbGluZyB3aXRoXG4gICAgY29uc3QgcmVzcG9uc2VXaXRoTm9IZWFkID0gcmVzcG9uc2UucmVwbGFjZShIRUFEX1RBR19SRUdFWCwgJycpXG4gICAgY29uc3Qgc3RhcnRUYWcgPSBnZXRTdGFydFRhZyhyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi9cbiAgICBsZXQgZnJhZ21lbnRcbiAgICBpZiAoc3RhcnRUYWcgPT09ICdodG1sJykge1xuICAgICAgLy8gaWYgaXQgaXMgYSBmdWxsIGRvY3VtZW50LCBwYXJzZSBpdCBhbmQgcmV0dXJuIHRoZSBib2R5XG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIGlmIChzdGFydFRhZyA9PT0gJ2JvZHknKSB7XG4gICAgICAvLyBwYXJzZSBib2R5IHcvbyB3cmFwcGluZyBpbiB0ZW1wbGF0ZVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgbm9uLWJvZHkgcGFydGlhbCBIVE1MIGNvbnRlbnQsIHNvIHdyYXAgaXQgaW4gYSB0ZW1wbGF0ZSB0byBtYXhpbWl6ZSBwYXJzaW5nIGZsZXhpYmlsaXR5XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwoJzxib2R5Pjx0ZW1wbGF0ZSBjbGFzcz1cImludGVybmFsLWh0bXgtd3JhcHBlclwiPicgKyByZXNwb25zZVdpdGhOb0hlYWQgKyAnPC90ZW1wbGF0ZT48L2JvZHk+JylcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKGRvYy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpLmNvbnRlbnQpXG4gICAgICAvLyBleHRyYWN0IHRpdGxlIGludG8gZnJhZ21lbnQgZm9yIGxhdGVyIHByb2Nlc3NpbmdcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG5cbiAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyB3ZSBzdXBwb3J0IGEgdGl0bGUgdGFnIGF0IHRoZSByb290IGxldmVsIG9mIG5vbi1ib2R5IHJlc3BvbnNlcywgc28gd2UgbmVlZCB0byBoYW5kbGUgaXRcbiAgICAgIHZhciB0aXRsZUVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbGVtZW50ICYmIHRpdGxlRWxlbWVudC5wYXJlbnROb2RlID09PSBmcmFnbWVudCkge1xuICAgICAgICB0aXRsZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgICAgZnJhZ21lbnQudGl0bGUgPSB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93U2NyaXB0VGFncykge1xuICAgICAgICBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBzY3JpcHQgdGFncyBpZiBzY3JpcHRzIGFyZSBkaXNhYmxlZFxuICAgICAgICBmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKS5mb3JFYWNoKChzY3JpcHQpID0+IHNjcmlwdC5yZW1vdmUoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVDYWxsKGZ1bmMpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgZnVuYygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBpc1R5cGUobywgdHlwZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIEZ1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIE9iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUmF3T2JqZWN0KG8pIHtcbiAgICByZXR1cm4gaXNUeXBlKG8sICdPYmplY3QnKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9uSGFuZGxlclxuICAgKiBAcHJvcGVydHkgeyhrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwKXxzdHJpbmd9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RlbmVySW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IG9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14Tm9kZUludGVybmFsRGF0YVxuICAgKiBFbGVtZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbml0SGFzaF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYm9vc3RlZF1cbiAgICogQHByb3BlcnR5IHtPbkhhbmRsZXJbXX0gW29uSGFuZGxlcnNdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHByb3BlcnR5IHtMaXN0ZW5lckluZm9bXX0gW2xpc3RlbmVySW5mb3NdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhbmNlbGxlZF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdHJpZ2dlcmVkT25jZV1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheWVkXVxuICAgKiBAcHJvcGVydHkge251bWJlcnxudWxsfSBbdGhyb3R0bGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFzdFZhbHVlXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2FkZWRdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJiXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwb2xsaW5nXVxuICAgKiBAcHJvcGVydHkge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8bnVsbH0gW2xhc3RCdXR0b25DbGlja2VkXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3JlcXVlc3RDb3VudF1cbiAgICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0gW3hocl1cbiAgICogQHByb3BlcnR5IHsoKCkgPT4gdm9pZClbXX0gW3F1ZXVlZFJlcXVlc3RzXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthYm9ydGFibGVdXG4gICAqXG4gICAqIEV2ZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IFt0cmlnZ2VyU3BlY11cbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldFtdfSBbaGFuZGxlZEZvcl1cbiAgICovXG5cbiAgLyoqXG4gICAqIGdldEludGVybmFsRGF0YSByZXRyaWV2ZXMgXCJwcml2YXRlXCIgZGF0YSBzdG9yZWQgYnkgaHRteCB3aXRoaW4gYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEV2ZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxEYXRhKGVsdCkge1xuICAgIGNvbnN0IGRhdGFQcm9wID0gJ2h0bXgtaW50ZXJuYWwtZGF0YSdcbiAgICBsZXQgZGF0YSA9IGVsdFtkYXRhUHJvcF1cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGRhdGEgPSBlbHRbZGF0YVByb3BdID0ge31cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0FycmF5IGNvbnZlcnRzIGFuIEFycmF5TGlrZSBvYmplY3QgaW50byBhIHJlYWwgYXJyYXkuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHJldHVybnMge1RbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkoYXJyKSB7XG4gICAgY29uc3QgcmV0dXJuQXJyID0gW11cbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXR1cm5BcnIucHVzaChhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5BcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1RbXXxOYW1lZE5vZGVNYXB8SFRNTENvbGxlY3Rpb258SFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb258QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHBhcmFtIHsoVCkgPT4gdm9pZH0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gZm9yRWFjaChhcnIsIGZ1bmMpIHtcbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBmdW5jKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsZWRJbnRvVmlldyhlbCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGVsZW1Ub3AgPSByZWN0LnRvcFxuICAgIGNvbnN0IGVsZW1Cb3R0b20gPSByZWN0LmJvdHRvbVxuICAgIHJldHVybiBlbGVtVG9wIDwgd2luZG93LmlubmVySGVpZ2h0ICYmIGVsZW1Cb3R0b20gPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gYm9keUNvbnRhaW5zKGVsdCkge1xuICAgIC8vIElFIEZpeFxuICAgIGNvbnN0IHJvb3ROb2RlID0gZWx0LmdldFJvb3ROb2RlICYmIGVsdC5nZXRSb290Tm9kZSgpXG4gICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QpIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMocm9vdE5vZGUuaG9zdClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHNwbGl0T25XaGl0ZXNwYWNlKHRyaWdnZXIpIHtcbiAgICByZXR1cm4gdHJpZ2dlci50cmltKCkuc3BsaXQoL1xccysvKVxuICB9XG5cbiAgLyoqXG4gICAqIG1lcmdlT2JqZWN0cyB0YWtlcyBhbGwgdGhlIGtleXMgZnJvbVxuICAgKiBvYmoyIGFuZCBkdXBsaWNhdGVzIHRoZW0gaW50byBvYmoxXG4gICAqIEB0ZW1wbGF0ZSBUMVxuICAgKiBAdGVtcGxhdGUgVDJcbiAgICogQHBhcmFtIHtUMX0gb2JqMVxuICAgKiBAcGFyYW0ge1QyfSBvYmoyXG4gICAqIEByZXR1cm5zIHtUMSAmIFQyfVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmoyKSB7XG4gICAgICBpZiAob2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgcmV0dXJuIG9iajFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30galN0cmluZ1xuICAgKiBAcmV0dXJucyB7YW55fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUpTT04oalN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShqU3RyaW5nKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dFcnJvcihlcnJvcilcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkge1xuICAgIGNvbnN0IHRlc3QgPSAnaHRteDpsb2NhbFN0b3JhZ2VUZXN0J1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KVxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoKVxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBwYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCB1bmxlc3MgaW5kZXggcGFnZVxuICAgICAgaWYgKCEoL15cXC8kLy50ZXN0KHBhdGgpKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBiZSBraW5kIHRvIElFMTEsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBVUkwoKVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHVibGljIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gaW50ZXJuYWxFdmFsKHN0cikge1xuICAgIHJldHVybiBtYXliZUV2YWwoZ2V0RG9jdW1lbnQoKS5ib2R5LCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBldmFsKHN0cilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjYWxsYmFjayBmb3IgdGhlICoqaHRteDpsb2FkKiogZXZlbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvY2VzcyBuZXcgY29udGVudCwgZm9yIGV4YW1wbGUgaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50IHdpdGggYSBqYXZhc2NyaXB0IGxpYnJhcnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25Mb2FkXG4gICAqXG4gICAqIEBwYXJhbSB7KGVsdDogTm9kZSkgPT4gdm9pZH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGNhbGwgb24gbmV3bHkgbG9hZGVkIGNvbnRlbnRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvbkxvYWRIZWxwZXIoY2FsbGJhY2spIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0bXgub24oJ2h0bXg6bG9hZCcsIC8qKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldnQgKi8gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjYWxsYmFjayhldnQuZGV0YWlsLmVsdClcbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIExvZyBhbGwgaHRteCBldmVudHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dBbGxcbiAgICovXG4gIGZ1bmN0aW9uIGxvZ0FsbCgpIHtcbiAgICBodG14LmxvZ2dlciA9IGZ1bmN0aW9uKGVsdCwgZXZlbnQsIGRhdGEpIHtcbiAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LCBlbHQsIGRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nTm9uZSgpIHtcbiAgICBodG14LmxvZ2dlciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudCBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZEFsbFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudHMgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD59XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQWxsKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRBbGwoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgV2luZG93XG4gICAqL1xuICBmdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHdpbmRvd1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsdCwgZGVsYXkpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUVsZW1lbnQoZWx0KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RWx0KGVsdCkucmVtb3ZlQ2hpbGQoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0h0bWxFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqIEByZXR1cm4ge1BhcmVudE5vZGV8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzUGFyZW50Tm9kZShlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFkZHMgYSBjbGFzcyB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWRkQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgY2xhc3MgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byBhZGRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSBjbGFzcyBpcyBhZGRlZFxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eiwgZGVsYXkpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0LmNsYXNzTGlzdCAmJiBlbHQuY2xhc3NMaXN0LmFkZChjbGF6eilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsYXNzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gbm9kZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgY2xhc3MgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgY2xhc3MgaXMgcmVtb3ZlZClcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQobm9kZSwgY2xhenosIGRlbGF5KSB7XG4gICAgbGV0IGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KG5vZGUpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShjbGF6eilcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGNsYXNzZXMgbGVmdCwgcmVtb3ZlIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGdpdmVuIGNsYXNzIG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdG9nZ2xlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRvZ2dsZSB0aGUgY2xhc3Mgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0b2dnbGVcbiAgICovXG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzT25FbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBlbHQuY2xhc3NMaXN0LnRvZ2dsZShjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSBpdHMgc2libGluZ3MsIHNvIHRoYXQgYW1vbmcgaXRzIHNpYmxpbmdzLCBvbmx5IHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Rha2VDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRha2UgdGhlIGNsYXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdGFrZVxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNsYXNzRm9yRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZm9yRWFjaChlbHQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXp6KVxuICAgIH0pXG4gICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGVsdCksIGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjbG9zZXN0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzIHBhcmVudGFnZSwgaW5jbHVzaXZlIG9mIHRoZSBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2Nsb3Nlc3RcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIHNlbGVjdG9yIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBmaW5kXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZXN0KGVsdCwgc2VsZWN0b3IpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmIChlbHQgJiYgZWx0LmNsb3Nlc3QpIHtcbiAgICAgIHJldHVybiBlbHQuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyByZW1vdmUgd2hlbiBJRSBnb2VzIGF3YXlcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGVsdCA9PSBudWxsIHx8IG1hdGNoZXMoZWx0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbHQgPSBlbHQgJiYgYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSlcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwcmVmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzdWZmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgPT09IHN1ZmZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICBjb25zdCB0cmltbWVkU2VsZWN0b3IgPSBzZWxlY3Rvci50cmltKClcbiAgICBpZiAoc3RhcnRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICc8JykgJiYgZW5kc1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnLz4nKSkge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3Rvci5zdWJzdHJpbmcoMSwgdHJpbW1lZFNlbGVjdG9yLmxlbmd0aCAtIDIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfEVsZW1lbnR8RG9jdW1lbnR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLCBnbG9iYWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoc2VsZWN0b3IuaW5kZXhPZignY2xvc2VzdCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtjbG9zZXN0KGFzRWxlbWVudChlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOCkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2ZpbmQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbZmluZChhc1BhcmVudE5vZGUoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ25leHQnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLm5leHRFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ25leHQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkZvcndhcmRRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncHJldmlvdXMnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdwcmV2aW91cyAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuQmFja3dhcmRzUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudF1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnd2luZG93Jykge1xuICAgICAgcmV0dXJuIFt3aW5kb3ddXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2JvZHknKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50LmJvZHldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3Jvb3QnKSB7XG4gICAgICByZXR1cm4gW2dldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZ2xvYmFsICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLnNsaWNlKDcpLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdG9BcnJheShhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkZvcndhcmRRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5CYWNrd2FyZHNRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd31cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3RvcilbMF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZ2V0RG9jdW1lbnQoKS5ib2R5LCBlbHRPclNlbGVjdG9yKVswXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge0V2ZW50VGFyZ2V0fSBUXG4gICAqIEBwYXJhbSB7VHxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtUfSBbY29udGV4dF1cbiAgICogQHJldHVybnMge0VsZW1lbnR8VHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVRhcmdldChlbHRPclNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZpbmQoYXNQYXJlbnROb2RlKGNvbnRleHQpIHx8IGRvY3VtZW50LCBlbHRPclNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7a2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcHxzdHJpbmd9IEFueUV2ZW50TmFtZVxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXZlbnRBcmdzXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICAgKiBAcHJvcGVydHkge0FueUV2ZW50TmFtZX0gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxBbnlFdmVudE5hbWV9IGFyZzFcbiAgICogQHBhcmFtIHtBbnlFdmVudE5hbWV8RXZlbnRMaXN0ZW5lcn0gYXJnMlxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXVxuICAgKiBAcmV0dXJucyB7RXZlbnRBcmdzfVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oYXJnMikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogZ2V0RG9jdW1lbnQoKS5ib2R5LFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMSksXG4gICAgICAgIGxpc3RlbmVyOiBhcmcyXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogcmVzb2x2ZVRhcmdldChhcmcxKSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzIpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnM1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBsaXN0ZW5lciB0byB8IHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3IgfCB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICBjb25zdCBiID0gaXNGdW5jdGlvbihhcmcyKVxuICAgIHJldHVybiBiID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvZmZcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oYXJnMikgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTm9kZSBwcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3QgRFVNTVlfRUxUID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdvdXRwdXQnKSAvLyBkdW1teSBlbGVtZW50IGZvciBiYWQgc2VsZWN0b3JzXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ck5hbWVcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgYXR0ck5hbWUpIHtcbiAgICBjb25zdCBhdHRyVGFyZ2V0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0ck5hbWUpXG4gICAgaWYgKGF0dHJUYXJnZXQpIHtcbiAgICAgIGlmIChhdHRyVGFyZ2V0ID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIFtmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyTmFtZSldXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgYXR0clRhcmdldClcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsb2dFcnJvcignVGhlIHNlbGVjdG9yIFwiJyArIGF0dHJUYXJnZXQgKyAnXCIgb24gJyArIGF0dHJOYW1lICsgJyByZXR1cm5lZCBubyBtYXRjaGVzIScpXG4gICAgICAgICAgcmV0dXJuIFtEVU1NWV9FTFRdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBhc0VsZW1lbnQoZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoYXNFbGVtZW50KGVsdCksIGF0dHJpYnV0ZSkgIT0gbnVsbFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VGFyZ2V0KGVsdCkge1xuICAgIGNvbnN0IHRhcmdldFN0ciA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKVxuICAgIGlmICh0YXJnZXRTdHIpIHtcbiAgICAgIGlmICh0YXJnZXRTdHIgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRhcmdldFN0cilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAoZGF0YS5ib29zdGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUobmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXNUb1NldHRsZSA9IGh0bXguY29uZmlnLmF0dHJpYnV0ZXNUb1NldHRsZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlc1RvU2V0dGxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmFtZSA9PT0gYXR0cmlidXRlc1RvU2V0dGxlW2ldKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VUb1xuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlRnJvbVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvbmVBdHRyaWJ1dGVzKG1lcmdlVG8sIG1lcmdlRnJvbSkge1xuICAgIGZvckVhY2gobWVyZ2VUby5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoIW1lcmdlRnJvbS5oYXNBdHRyaWJ1dGUoYXR0ci5uYW1lKSAmJiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKG1lcmdlRnJvbS5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpIHtcbiAgICBjb25zdCBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyh0YXJnZXQpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzSW5saW5lU3dhcChzd2FwU3R5bGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFN0eWxlID09PSAnb3V0ZXJIVE1MJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvb2JWYWx1ZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9vYkVsZW1lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGxldCBzZWxlY3RvciA9ICcjJyArIGdldFJhd0F0dHJpYnV0ZShvb2JFbGVtZW50LCAnaWQnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFN0eWxlICovXG4gICAgbGV0IHN3YXBTdHlsZSA9ICdvdXRlckhUTUwnXG4gICAgaWYgKG9vYlZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKG9vYlZhbHVlLmluZGV4T2YoJzonKSA+IDApIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlLnN1YnN0cigwLCBvb2JWYWx1ZS5pbmRleE9mKCc6JykpXG4gICAgICBzZWxlY3RvciA9IG9vYlZhbHVlLnN1YnN0cihvb2JWYWx1ZS5pbmRleE9mKCc6JykgKyAxLCBvb2JWYWx1ZS5sZW5ndGgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICBpZiAodGFyZ2V0cykge1xuICAgICAgZm9yRWFjaChcbiAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgICAgbGV0IGZyYWdtZW50XG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudENsb25lID0gb29iRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICBmcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQob29iRWxlbWVudENsb25lKVxuICAgICAgICAgIGlmICghaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBhc1BhcmVudE5vZGUob29iRWxlbWVudENsb25lKSAvLyBpZiB0aGlzIGlzIG5vdCBhbiBpbmxpbmUgc3dhcCwgd2UgdXNlIHRoZSBjb250ZW50IG9mIHRoZSBub2RlLCBub3QgdGhlIG5vZGUgaXRzZWxmXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlU3dhcERldGFpbHMgPSB7IHNob3VsZFN3YXA6IHRydWUsIHRhcmdldCwgZnJhZ21lbnQgfVxuICAgICAgICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6b29iQmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICAgICAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgICAgICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgICAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCB0YXJnZXQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14Om9vYkFmdGVyU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6b29iRXJyb3JOb1RhcmdldCcsIHsgY29udGVudDogb29iRWxlbWVudCB9KVxuICAgIH1cbiAgICByZXR1cm4gb29iVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudCkge1xuICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ1toeC1wcmVzZXJ2ZV0sIFtkYXRhLWh4LXByZXNlcnZlXScpLCBmdW5jdGlvbihwcmVzZXJ2ZWRFbHQpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0QXR0cmlidXRlVmFsdWUocHJlc2VydmVkRWx0LCAnaWQnKVxuICAgICAgY29uc3Qgb2xkRWx0ID0gZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgIGlmIChvbGRFbHQgIT0gbnVsbCkge1xuICAgICAgICBwcmVzZXJ2ZWRFbHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQob2xkRWx0LCBwcmVzZXJ2ZWRFbHQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyksIGZ1bmN0aW9uKG5ld05vZGUpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UmF3QXR0cmlidXRlKG5ld05vZGUsICdpZCcpXG4gICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkSWQgPSBpZC5yZXBsYWNlKFwiJ1wiLCBcIlxcXFwnXCIpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYWcgPSBuZXdOb2RlLnRhZ05hbWUucmVwbGFjZSgnOicsICdcXFxcOicpXG4gICAgICAgIGNvbnN0IHBhcmVudEVsdCA9IGFzUGFyZW50Tm9kZShwYXJlbnROb2RlKVxuICAgICAgICBjb25zdCBvbGROb2RlID0gcGFyZW50RWx0ICYmIHBhcmVudEVsdC5xdWVyeVNlbGVjdG9yKG5vcm1hbGl6ZWRUYWcgKyBcIltpZD0nXCIgKyBub3JtYWxpemVkSWQgKyBcIiddXCIpXG4gICAgICAgIGlmIChvbGROb2RlICYmIG9sZE5vZGUgIT09IHBhcmVudEVsdCkge1xuICAgICAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBuZXdOb2RlLmNsb25lTm9kZSgpXG4gICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG9sZE5vZGUpXG4gICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG5ld0F0dHJpYnV0ZXMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBjaGlsZFxuICAgKiBAcmV0dXJucyB7SHRteFNldHRsZVRhc2t9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlQWpheExvYWRUYXNrKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHByb2Nlc3NOb2RlKGFzRWxlbWVudChjaGlsZCkpXG4gICAgICBwcm9jZXNzRm9jdXMoYXNQYXJlbnROb2RlKGNoaWxkKSlcbiAgICAgIHRyaWdnZXJFdmVudChjaGlsZCwgJ2h0bXg6bG9hZCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gY2hpbGRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NGb2N1cyhjaGlsZCkge1xuICAgIGNvbnN0IGF1dG9mb2N1cyA9ICdbYXV0b2ZvY3VzXSdcbiAgICBjb25zdCBhdXRvRm9jdXNlZEVsdCA9IGFzSHRtbEVsZW1lbnQobWF0Y2hlcyhjaGlsZCwgYXV0b2ZvY3VzKSA/IGNoaWxkIDogY2hpbGQucXVlcnlTZWxlY3RvcihhdXRvZm9jdXMpKVxuICAgIGlmIChhdXRvRm9jdXNlZEVsdCAhPSBudWxsKSB7XG4gICAgICBhdXRvRm9jdXNlZEVsdC5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge05vZGV9IGluc2VydEJlZm9yZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydEJlZm9yZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIHdoaWxlIChmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZFxuICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGNoaWxkKSwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbnNlcnRCZWZvcmUpXG4gICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJhc2VkIG9uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2h5YW1hbW90by9mZDQzNTUwNWQyOWViZmEzZDk3MTZmZDJiZThkNDJmMCxcbiAgICogZGVyaXZlZCBmcm9tIEphdmEncyBzdHJpbmcgaGFzaGNvZGUgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaGFzaFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nSGFzaChzdHJpbmcsIGhhc2gpIHtcbiAgICBsZXQgY2hhciA9IDBcbiAgICB3aGlsZSAoY2hhciA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBzdHJpbmcuY2hhckNvZGVBdChjaGFyKyspIHwgMCAvLyBiaXR3aXNlIG9yIGVuc3VyZXMgd2UgaGF2ZSBhIDMyLWJpdCBpbnRcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYXR0cmlidXRlSGFzaChlbHQpIHtcbiAgICBsZXQgaGFzaCA9IDBcbiAgICAvLyBJRSBmaXhcbiAgICBpZiAoZWx0LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWx0LmF0dHJpYnV0ZXNbaV1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZS52YWx1ZSkgeyAvLyBvbmx5IGluY2x1ZGUgYXR0cmlidXRlcyB3LyBhY3R1YWwgdmFsdWVzIChlbXB0eSBpcyBzYW1lIGFzIG5vbi1leGlzdGVudClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUubmFtZSwgaGFzaClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUudmFsdWUsIGhhc2gpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE9uSGFuZGxlcnMoZWx0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZm8gPSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1tpXVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChlbHQsIGhhbmRsZXJJbmZvLmV2ZW50LCBoYW5kbGVySW5mby5saXN0ZW5lcilcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE5vZGUoZWxlbWVudCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbGVtZW50KVxuICAgIGlmIChpbnRlcm5hbERhdGEudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVybmFsRGF0YS50aW1lb3V0KVxuICAgIH1cbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MpIHtcbiAgICAgIGZvckVhY2goaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MsIGZ1bmN0aW9uKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8ub24pIHtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChpbmZvLm9uLCBpbmZvLnRyaWdnZXIsIGluZm8ubGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWxlbWVudClcbiAgICBmb3JFYWNoKE9iamVjdC5rZXlzKGludGVybmFsRGF0YSksIGZ1bmN0aW9uKGtleSkgeyBkZWxldGUgaW50ZXJuYWxEYXRhW2tleV0gfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuVXBFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKVxuICAgIGRlSW5pdE5vZGUoZWxlbWVudClcbiAgICAvLyBAdHMtaWdub3JlIElFMTEgY29kZVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikgeyAvLyBJRVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yRWFjaChlbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkgeyBjbGVhblVwRWxlbWVudChjaGlsZCkgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiB0YXJnZXQudGFnTmFtZSA9PT0gJ0JPRFknKSB7IC8vIHNwZWNpYWwgY2FzZSB0aGUgYm9keSB0byBpbm5lckhUTUwgYmVjYXVzZSBEb2N1bWVudEZyYWdtZW50cyBjYW4ndCBjb250YWluIGEgYm9keSBlbHQgdW5mb3J0dW5hdGVseVxuICAgICAgcmV0dXJuIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtOb2RlfSAqL1xuICAgIGxldCBuZXdFbHRcbiAgICBjb25zdCBlbHRCZWZvcmVOZXdDb250ZW50ID0gdGFyZ2V0LnByZXZpb3VzU2libGluZ1xuICAgIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChlbHRCZWZvcmVOZXdDb250ZW50ID09IG51bGwpIHtcbiAgICAgIG5ld0VsdCA9IHBhcmVudEVsdCh0YXJnZXQpLmZpcnN0Q2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWx0ID0gZWx0QmVmb3JlTmV3Q29udGVudC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBzZXR0bGVJbmZvLmVsdHMgPSBzZXR0bGVJbmZvLmVsdHMuZmlsdGVyKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUgIT09IHRhcmdldCB9KVxuICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgbmV3bHkgYWRkZWQgY29udGVudCBhbmQgYWRkIGFsbCBlbGVtZW50cyB0byB0aGUgc2V0dGxlIGluZm8gc28gd2UgdHJpZ2dlclxuICAgIC8vIGV2ZW50cyBwcm9wZXJseSBvbiB0aGVtXG4gICAgd2hpbGUgKG5ld0VsdCAmJiBuZXdFbHQgIT09IHRhcmdldCkge1xuICAgICAgaWYgKG5ld0VsdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgc2V0dGxlSW5mby5lbHRzLnB1c2gobmV3RWx0KVxuICAgICAgfVxuICAgICAgbmV3RWx0ID0gbmV3RWx0Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGFyZ2V0LnJlbW92ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgdGFyZ2V0LmZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBudWxsLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQubmV4dFNpYmxpbmcsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqL1xuICBmdW5jdGlvbiBzd2FwRGVsZXRlKHRhcmdldCkge1xuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICByZXR1cm4gcGFyZW50RWx0KHRhcmdldCkucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgY29uc3QgZmlyc3RDaGlsZCA9IHRhcmdldC5maXJzdENoaWxkXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBmaXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgd2hpbGUgKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICB9XG4gICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkKVxuICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHN3aXRjaCAoc3dhcFN0eWxlKSB7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdvdXRlckhUTUwnOlxuICAgICAgICBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJiZWdpbic6XG4gICAgICAgIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlYmVnaW4nOlxuICAgICAgICBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmVlbmQnOlxuICAgICAgICBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJlbmQnOlxuICAgICAgICBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBzd2FwRGVsZXRlKHRhcmdldClcbiAgICAgICAgcmV0dXJuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMoZWx0KVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBleHRlbnNpb25zW2ldXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZXh0LmhhbmRsZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0VsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGhhbmRsZVN3YXAgcmV0dXJucyBhbiBhcnJheSAobGlrZSkgb2YgZWxlbWVudHMsIHdlIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdFbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBuZXdFbGVtZW50c1tqXVxuICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3dhcFN0eWxlID09PSAnaW5uZXJIVE1MJykge1xuICAgICAgICAgIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2FwV2l0aFN0eWxlKGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICB2YXIgb29iRWx0cyA9IGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtc3dhcC1vb2JdLCBbZGF0YS1oeC1zd2FwLW9vYl0nKVxuICAgIGZvckVhY2gob29iRWx0cywgZnVuY3Rpb24ob29iRWxlbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93TmVzdGVkT29iU3dhcHMgfHwgb29iRWxlbWVudC5wYXJlbnRFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG9vYlZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUob29iRWxlbWVudCwgJ2h4LXN3YXAtb29iJylcbiAgICAgICAgaWYgKG9vYlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaHgtc3dhcC1vb2InKVxuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oeC1zd2FwLW9vYicpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gb29iRWx0cy5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBjb21wbGV0ZSBzd2FwcGluZyBwaXBlbGluZSwgaW5jbHVkaW5nOiBmb2N1cyBhbmQgc2VsZWN0aW9uIHByZXNlcnZhdGlvbixcbiAgICogdGl0bGUgdXBkYXRlcywgc2Nyb2xsLCBPT0Igc3dhcHBpbmcsIG5vcm1hbCBzd2FwcGluZyBhbmQgc2V0dGxpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKiBAcGFyYW0ge1N3YXBPcHRpb25zfSBbc3dhcE9wdGlvbnNdXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwKHRhcmdldCwgY29udGVudCwgc3dhcFNwZWMsIHN3YXBPcHRpb25zKSB7XG4gICAgaWYgKCFzd2FwT3B0aW9ucykge1xuICAgICAgc3dhcE9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIHRhcmdldCA9IHJlc29sdmVUYXJnZXQodGFyZ2V0KVxuXG4gICAgLy8gcHJlc2VydmUgZm9jdXMgYW5kIHNlbGVjdGlvblxuICAgIGNvbnN0IGFjdGl2ZUVsdCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICBsZXQgc2VsZWN0aW9uSW5mbyA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIHNlbGVjdGlvbkluZm8gPSB7XG4gICAgICAgIGVsdDogYWN0aXZlRWx0LFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXJ0OiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uU3RhcnQgOiBudWxsLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVuZDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvbkVuZCA6IG51bGxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzYWZhcmkgaXNzdWUgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9wbGF5d3JpZ2h0L2lzc3Vlcy81ODk0XG4gICAgfVxuICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpXG5cbiAgICAvLyBGb3IgdGV4dCBjb250ZW50IHN3YXBzLCBkb24ndCBwYXJzZSB0aGUgcmVzcG9uc2UgYXMgSFRNTCwganVzdCBpbnNlcnQgaXRcbiAgICBpZiAoc3dhcFNwZWMuc3dhcFN0eWxlID09PSAndGV4dENvbnRlbnQnKSB7XG4gICAgICB0YXJnZXQudGV4dENvbnRlbnQgPSBjb250ZW50XG4gICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBmcmFnbWVudCBhbmQgcHJvY2VzcyBpdFxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY29udGVudClcblxuICAgICAgc2V0dGxlSW5mby50aXRsZSA9IGZyYWdtZW50LnRpdGxlXG5cbiAgICAgIC8vIHNlbGVjdC1vb2Igc3dhcHNcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3RPT0IpIHtcbiAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWVzID0gc3dhcE9wdGlvbnMuc2VsZWN0T09CLnNwbGl0KCcsJylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvb2JTZWxlY3RWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlc1tpXS5zcGxpdCgnOicsIDIpXG4gICAgICAgICAgbGV0IGlkID0gb29iU2VsZWN0VmFsdWVbMF0udHJpbSgpXG4gICAgICAgICAgaWYgKGlkLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcoMSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBvb2JTZWxlY3RWYWx1ZVsxXSB8fCAndHJ1ZSdcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignIycgKyBpZClcbiAgICAgICAgICBpZiAob29iRWxlbWVudCkge1xuICAgICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9vYiBzd2Fwc1xuICAgICAgZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ3RlbXBsYXRlJyksIC8qKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlICovZnVuY3Rpb24odGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGZpbmRBbmRTd2FwT29iRWxlbWVudHModGVtcGxhdGUuY29udGVudCwgc2V0dGxlSW5mbykpIHtcbiAgICAgICAgICAvLyBBdm9pZCBwb2xsdXRpbmcgdGhlIERPTSB3aXRoIGVtcHR5IHRlbXBsYXRlcyB0aGF0IHdlcmUgb25seSB1c2VkIHRvIGVuY2Fwc3VsYXRlIG9vYiBzd2FwXG4gICAgICAgICAgdGVtcGxhdGUucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gbm9ybWFsIHN3YXBcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3QpIHtcbiAgICAgICAgY29uc3QgbmV3RnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3dhcE9wdGlvbnMuc2VsZWN0KSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIG5ld0ZyYWdtZW50LmFwcGVuZENoaWxkKG5vZGUpXG4gICAgICAgIH0pXG4gICAgICAgIGZyYWdtZW50ID0gbmV3RnJhZ21lbnRcbiAgICAgIH1cbiAgICAgIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KVxuICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3BlYy5zd2FwU3R5bGUsIHN3YXBPcHRpb25zLmNvbnRleHRFbGVtZW50LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cblxuICAgIC8vIGFwcGx5IHNhdmVkIGZvY3VzIGFuZCBzZWxlY3Rpb24gaW5mb3JtYXRpb24gdG8gc3dhcHBlZCBjb250ZW50XG4gICAgaWYgKHNlbGVjdGlvbkluZm8uZWx0ICYmXG4gICAgICAhYm9keUNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZWx0KSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSkge1xuICAgICAgY29uc3QgbmV3QWN0aXZlRWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSlcbiAgICAgIGNvbnN0IGZvY3VzT3B0aW9ucyA9IHsgcHJldmVudFNjcm9sbDogc3dhcFNwZWMuZm9jdXNTY3JvbGwgIT09IHVuZGVmaW5lZCA/ICFzd2FwU3BlYy5mb2N1c1Njcm9sbCA6ICFodG14LmNvbmZpZy5kZWZhdWx0Rm9jdXNTY3JvbGwgfVxuICAgICAgaWYgKG5ld0FjdGl2ZUVsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChzZWxlY3Rpb25JbmZvLnN0YXJ0ICYmIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uSW5mby5zdGFydCwgc2VsZWN0aW9uSW5mby5lbmQpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdGhlIHNldFNlbGVjdGlvblJhbmdlIG1ldGhvZCBpcyBwcmVzZW50IG9uIGZpZWxkcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQsIHNvIGp1c3QgbGV0IHRoaXMgZmFpbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdBY3RpdmVFbHQuZm9jdXMoZm9jdXNPcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG4gICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU3dhcCcsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICB9KVxuICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaykge1xuICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2soKVxuICAgIH1cblxuICAgIC8vIG1lcmdlIGluIG5ldyB0aXRsZSBhZnRlciBzd2FwIGJ1dCBiZWZvcmUgc2V0dGxlXG4gICAgaWYgKCFzd2FwU3BlYy5pZ25vcmVUaXRsZSkge1xuICAgICAgaGFuZGxlVGl0bGUoc2V0dGxlSW5mby50aXRsZSlcbiAgICB9XG5cbiAgICAvLyBzZXR0bGVcbiAgICBjb25zdCBkb1NldHRsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLnRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgIHRhc2suY2FsbCgpXG4gICAgICB9KVxuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTZXR0bGUnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgICB9KVxuXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYW5jaG9yKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclRhcmdldCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KCcjJyArIHN3YXBPcHRpb25zLmFuY2hvcikpXG4gICAgICAgIGlmIChhbmNob3JUYXJnZXQpIHtcbiAgICAgICAgICBhbmNob3JUYXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6ICdhdXRvJyB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVNjcm9sbFN0YXRlKHNldHRsZUluZm8uZWx0cywgc3dhcFNwZWMpXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaykge1xuICAgICAgICBzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3dhcFNwZWMuc2V0dGxlRGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU2V0dGxlLCBzd2FwU3BlYy5zZXR0bGVEZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TZXR0bGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCBoZWFkZXIsIGVsdCkge1xuICAgIGNvbnN0IHRyaWdnZXJCb2R5ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlcilcbiAgICBpZiAodHJpZ2dlckJvZHkuaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICBjb25zdCB0cmlnZ2VycyA9IHBhcnNlSlNPTih0cmlnZ2VyQm9keSlcbiAgICAgIGZvciAoY29uc3QgZXZlbnROYW1lIGluIHRyaWdnZXJzKSB7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgICAgbGV0IGRldGFpbCA9IHRyaWdnZXJzW2V2ZW50TmFtZV1cbiAgICAgICAgICBpZiAoaXNSYXdPYmplY3QoZGV0YWlsKSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWx0ID0gZGV0YWlsLnRhcmdldCAhPT0gdW5kZWZpbmVkID8gZGV0YWlsLnRhcmdldCA6IGVsdFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRhaWwgPSB7IHZhbHVlOiBkZXRhaWwgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBldmVudE5hbWVzID0gdHJpZ2dlckJvZHkuc3BsaXQoJywnKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZXNbaV0udHJpbSgpLCBbXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBXSElURVNQQUNFID0gL1xccy9cbiAgY29uc3QgV0hJVEVTUEFDRV9PUl9DT01NQSA9IC9bXFxzLF0vXG4gIGNvbnN0IFNZTUJPTF9TVEFSVCA9IC9bXyRhLXpBLVpdL1xuICBjb25zdCBTWU1CT0xfQ09OVCA9IC9bXyRhLXpBLVowLTldL1xuICBjb25zdCBTVFJJTkdJU0hfU1RBUlQgPSBbJ1wiJywgXCInXCIsICcvJ11cbiAgY29uc3QgTk9UX1dISVRFU1BBQ0UgPSAvW15cXHNdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVCA9IC9beyhdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQgPSAvW30pXS9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZVN0cmluZyhzdHIpIHtcbiAgICAvKiogQHR5cGUgc3RyaW5nW10gKi9cbiAgICBjb25zdCB0b2tlbnMgPSBbXVxuICAgIGxldCBwb3NpdGlvbiA9IDBcbiAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoKSB7XG4gICAgICBpZiAoU1lNQk9MX1NUQVJULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbikpKSB7XG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgd2hpbGUgKFNZTUJPTF9DT05ULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbiArIDEpKSkge1xuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIGlmIChTVFJJTkdJU0hfU1RBUlQuaW5kZXhPZihzdHIuY2hhckF0KHBvc2l0aW9uKSkgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2hhciA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoICYmIHN0ci5jaGFyQXQocG9zaXRpb24pICE9PSBzdGFydENoYXIpIHtcbiAgICAgICAgICBpZiAoc3RyLmNoYXJBdChwb3NpdGlvbikgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHRva2Vucy5wdXNoKHN5bWJvbClcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9uKytcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBsYXN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkge1xuICAgIHJldHVybiBTWU1CT0xfU1RBUlQuZXhlYyh0b2tlbi5jaGFyQXQoMCkpICYmXG4gICAgICB0b2tlbiAhPT0gJ3RydWUnICYmXG4gICAgICB0b2tlbiAhPT0gJ2ZhbHNlJyAmJlxuICAgICAgdG9rZW4gIT09ICd0aGlzJyAmJlxuICAgICAgdG9rZW4gIT09IHBhcmFtTmFtZSAmJlxuICAgICAgbGFzdCAhPT0gJy4nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Q29uZGl0aW9uYWxGdW5jdGlvbnxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCBwYXJhbU5hbWUpIHtcbiAgICBpZiAodG9rZW5zWzBdID09PSAnWycpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICBsZXQgYnJhY2tldENvdW50ID0gMVxuICAgICAgbGV0IGNvbmRpdGlvbmFsU291cmNlID0gJyByZXR1cm4gKGZ1bmN0aW9uKCcgKyBwYXJhbU5hbWUgKyAnKXsgcmV0dXJuICgnXG4gICAgICBsZXQgbGFzdCA9IG51bGxcbiAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1swXVxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBzaGlmdCBjYWxsLCBhbmQgdGhpbmtzIHdlJ3JlIGNvbXBhcmluZyB0aGUgc2FtZSB2YWx1ZSBoZXJlLCBpLmUuICdbJyB2cyAnXSdcbiAgICAgICAgaWYgKHRva2VuID09PSAnXScpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQtLVxuICAgICAgICAgIGlmIChicmFja2V0Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChsYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyAndHJ1ZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKX0pJ1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uRnVuY3Rpb24gPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oY29uZGl0aW9uYWxTb3VyY2UpKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pXG4gICAgICAgICAgICAgIGNvbmRpdGlvbkZ1bmN0aW9uLnNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlXG4gICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25GdW5jdGlvblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnN5bnRheDplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZTogY29uZGl0aW9uYWxTb3VyY2UgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdbJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudCsrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSkge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcoKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpID8gKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpIDogKHdpbmRvdy4nICsgdG9rZW4gKyAnKSknXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArIHRva2VuXG4gICAgICAgIH1cbiAgICAgICAgbGFzdCA9IHRva2Vucy5zaGlmdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gbWF0Y2hcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbCh0b2tlbnMsIG1hdGNoKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmICFtYXRjaC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHJlc3VsdCArPSB0b2tlbnMuc2hpZnQoKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKSB7XG4gICAgbGV0IHJlc3VsdFxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMCAmJiBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQpLnRyaW0oKVxuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY29uc3QgSU5QVVRfU0VMRUNUT1IgPSAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBsaWNpdFRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIGZvciB0cmlnZ2VyIHNwZWNzXG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSkge1xuICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXSAqL1xuICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVTdHJpbmcoZXhwbGljaXRUcmlnZ2VyKVxuICAgIGRvIHtcbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IHRva2Vucy5sZW5ndGhcbiAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLylcbiAgICAgIGlmICh0cmlnZ2VyICE9PSAnJykge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2V2ZXJ5Jykge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCBldmVyeSA9IHsgdHJpZ2dlcjogJ2V2ZXJ5JyB9XG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgZXZlcnkucG9sbEludGVydmFsID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLykpXG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgZXZlcnkuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaChldmVyeSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgdHJpZ2dlclNwZWMgPSB7IHRyaWdnZXIgfVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXSAhPT0gJywnKSB7XG4gICAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gJ2NoYW5nZWQnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnb25jZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMub25jZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdjb25zdW1lJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jb25zdW1lID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2RlbGF5JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5kZWxheSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZnJvbScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgaWYgKENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgICAgICBpZiAoZnJvbV9hcmcgPT09ICdjbG9zZXN0JyB8fCBmcm9tX2FyZyA9PT0gJ2ZpbmQnIHx8IGZyb21fYXJnID09PSAnbmV4dCcgfHwgZnJvbV9hcmcgPT09ICdwcmV2aW91cycpIHtcbiAgICAgICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgICAgICAvLyBgbmV4dGAgYW5kIGBwcmV2aW91c2AgYWxsb3cgYSBzZWxlY3Rvci1sZXNzIHN5bnRheFxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbV9hcmcgKz0gJyAnICsgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZnJvbSA9IGZyb21fYXJnXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGFyZ2V0JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50YXJnZXQgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Rocm90dGxlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50aHJvdHRsZSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncXVldWUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnF1ZXVlID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdyb290JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RocmVzaG9sZCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2godHJpZ2dlclNwZWMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSBpbml0aWFsTGVuZ3RoKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgIH0gd2hpbGUgKHRva2Vuc1swXSA9PT0gJywnICYmIHRva2Vucy5zaGlmdCgpKVxuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSA9IHRyaWdnZXJTcGVjc1xuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VHJpZ2dlclNwZWNzKGVsdCkge1xuICAgIGNvbnN0IGV4cGxpY2l0VHJpZ2dlciA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRyaWdnZXInKVxuICAgIGxldCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGlmIChleHBsaWNpdFRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gaHRteC5jb25maWcudHJpZ2dlclNwZWNzQ2FjaGVcbiAgICAgIHRyaWdnZXJTcGVjcyA9IChjYWNoZSAmJiBjYWNoZVtleHBsaWNpdFRyaWdnZXJdKSB8fCBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpXG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJTcGVjcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdzdWJtaXQnIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJidXR0b25cIl0sIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCBJTlBVVF9TRUxFQ1RPUikpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2hhbmdlJyB9XVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gY2FuY2VsUG9sbGluZyhlbHQpIHtcbiAgICBnZXRJbnRlcm5hbERhdGEoZWx0KS5jYW5jZWxsZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gc3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIG5vZGVEYXRhLnRpbWVvdXQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGJvZHlDb250YWlucyhlbHQpICYmIG5vZGVEYXRhLmNhbmNlbGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQoc3BlYywgZWx0LCBtYWtlRXZlbnQoJ2h4OnBvbGw6dHJpZ2dlcicsIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlYzogc3BlYyxcbiAgICAgICAgICB0YXJnZXQ6IGVsdFxuICAgICAgICB9KSkpIHtcbiAgICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpXG4gICAgICB9XG4gICAgfSwgc3BlYy5wb2xsSW50ZXJ2YWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MQW5jaG9yRWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNMb2NhbExpbmsoZWx0KSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uLmhvc3RuYW1lID09PSBlbHQuaG9zdG5hbWUgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpICE9PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGVsdElzRGlzYWJsZWQoZWx0KSB7XG4gICAgcmV0dXJuIGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqL1xuICBmdW5jdGlvbiBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgaWYgKChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBpc0xvY2FsTGluayhlbHQpICYmIChlbHQudGFyZ2V0ID09PSAnJyB8fCBlbHQudGFyZ2V0ID09PSAnX3NlbGYnKSkgfHwgKGVsdC50YWdOYW1lID09PSAnRk9STScgJiYgU3RyaW5nKGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKSkudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpKSB7XG4gICAgICBub2RlRGF0YS5ib29zdGVkID0gdHJ1ZVxuICAgICAgbGV0IHZlcmIsIHBhdGhcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgIHZlcmIgPSAnZ2V0J1xuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3QXR0cmlidXRlID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpXG4gICAgICAgIHZlcmIgPSByYXdBdHRyaWJ1dGUgPyByYXdBdHRyaWJ1dGUudG9Mb3dlckNhc2UoKSA6ICdnZXQnXG4gICAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgICB9XG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnYWN0aW9uJylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgfSwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZENhbmNlbChldnQsIG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChldnQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZXZ0LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwic3VibWl0XCJdLCBidXR0b24nKSAmJiBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGVsdC5ocmVmICYmXG4gICAgICAgIChlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT09ICcjJyB8fCBlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykuaW5kZXhPZignIycpICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fE1vdXNlRXZlbnR8S2V5Ym9hcmRFdmVudHxUb3VjaEV2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZXZ0LnR5cGUgPT09ICdjbGljaycgJiZcbiAgICAgIC8vIEB0cy1pZ25vcmUgdGhpcyB3aWxsIHJlc29sdmUgdG8gdW5kZWZpbmVkIGZvciBldmVudHMgdGhhdCBkb24ndCBkZWZpbmUgdGhvc2UgcHJvcGVydGllcywgd2hpY2ggaXMgZmluZVxuICAgICAgKGV2dC5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkge1xuICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXJcbiAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEZpbHRlci5jYWxsKGVsdCwgZXZ0KSAhPT0gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmVudEZpbHRlci5zb3VyY2VcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpldmVudEZpbHRlcjplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtleHBsaWNpdENhbmNlbF1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIGV4cGxpY2l0Q2FuY2VsKSB7XG4gICAgY29uc3QgZWxlbWVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIC8qKiBAdHlwZSB7KE5vZGV8V2luZG93KVtdfSAqL1xuICAgIGxldCBlbHRzVG9MaXN0ZW5PblxuICAgIGlmICh0cmlnZ2VyU3BlYy5mcm9tKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCB0cmlnZ2VyU3BlYy5mcm9tKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IFtlbHRdXG4gICAgfVxuICAgIC8vIHN0b3JlIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMsIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXkgY2hhbmdlXG4gICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uLmZvckVhY2goZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgfSlcbiAgICB9XG4gICAgZm9yRWFjaChlbHRzVG9MaXN0ZW5PbiwgZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGVsdFRvTGlzdGVuT24ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBsaWNpdENhbmNlbCB8fCBzaG91bGRDYW5jZWwoZXZ0LCBlbHQpKSB7XG4gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2dClcbiAgICAgICAgZXZlbnREYXRhLnRyaWdnZXJTcGVjID0gdHJpZ2dlclNwZWNcbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yID09IG51bGwpIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvciA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yLmluZGV4T2YoZWx0KSA8IDApIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvci5wdXNoKGVsdClcbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY29uc3VtZSkge1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50YXJnZXQgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKGFzRWxlbWVudChldnQudGFyZ2V0KSwgdHJpZ2dlclNwZWMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLm9uY2UpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgICAgICAgaWYgKGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEuZGVsYXllZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVsZW1lbnREYXRhLmRlbGF5ZWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocm90dGxlID4gMCkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gbnVsbFxuICAgICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy50aHJvdHRsZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLmRlbGF5ID4gMCkge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZGVsYXllZCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub2RlRGF0YS5saXN0ZW5lckluZm9zID09IG51bGwpIHtcbiAgICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcyA9IFtdXG4gICAgICB9XG4gICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyU3BlYy50cmlnZ2VyLFxuICAgICAgICBsaXN0ZW5lcjogZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgb246IGVsdFRvTGlzdGVuT25cbiAgICAgIH0pXG4gICAgICBlbHRUb0xpc3Rlbk9uLmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICB9KVxuICB9XG5cbiAgbGV0IHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2UgLy8gdXNlZCBieSBpbml0U2Nyb2xsSGFuZGxlclxuICBsZXQgc2Nyb2xsSGFuZGxlciA9IG51bGxcbiAgZnVuY3Rpb24gaW5pdFNjcm9sbEhhbmRsZXIoKSB7XG4gICAgaWYgKCFzY3JvbGxIYW5kbGVyKSB7XG4gICAgICBzY3JvbGxIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgICAgfVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpXG4gICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHdpbmRvd0lzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgICAgICAgIGZvckVhY2goZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXIqPSdyZXZlYWxlZCddLFtkYXRhLWh4LXRyaWdnZXIqPSdyZXZlYWxlZCddXCIpLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIG1heWJlUmV2ZWFsKGVsdClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVJldmVhbChlbHQpIHtcbiAgICBpZiAoIWhhc0F0dHJpYnV0ZShlbHQsICdkYXRhLWh4LXJldmVhbGVkJykgJiYgaXNTY3JvbGxlZEludG9WaWV3KGVsdCkpIHtcbiAgICAgIGVsdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaHgtcmV2ZWFsZWQnLCAndHJ1ZScpXG4gICAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAobm9kZURhdGEuaW5pdEhhc2gpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZSBub2RlIGlzbid0IGluaXRpYWxpemVkLCB3YWl0IGZvciBpdCBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgcmVxdWVzdFxuICAgICAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphZnRlclByb2Nlc3NOb2RlJywgZnVuY3Rpb24oKSB7IHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpIH0sIHsgb25jZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5XG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSW1tZWRpYXRlbHkoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgZGVsYXkpIHtcbiAgICBjb25zdCBsb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW5vZGVEYXRhLmxvYWRlZCkge1xuICAgICAgICBub2RlRGF0YS5sb2FkZWQgPSB0cnVlXG4gICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGxvYWQsIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGxldCBleHBsaWNpdEFjdGlvbiA9IGZhbHNlXG4gICAgZm9yRWFjaChWRVJCUywgZnVuY3Rpb24odmVyYikge1xuICAgICAgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC0nICsgdmVyYikpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LScgKyB2ZXJiKVxuICAgICAgICBleHBsaWNpdEFjdGlvbiA9IHRydWVcbiAgICAgICAgbm9kZURhdGEucGF0aCA9IHBhdGhcbiAgICAgICAgbm9kZURhdGEudmVyYiA9IHZlcmJcbiAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGV4cGxpY2l0QWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQGNhbGxiYWNrIFRyaWdnZXJIYW5kbGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IFtldnRdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKi9cbiAgZnVuY3Rpb24gYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGhhbmRsZXIpIHtcbiAgICBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ3JldmVhbGVkJykge1xuICAgICAgaW5pdFNjcm9sbEhhbmRsZXIoKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICAgIG1heWJlUmV2ZWFsKGFzRWxlbWVudChlbHQpKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2ludGVyc2VjdCcpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyT3B0aW9ucyA9IHt9XG4gICAgICBpZiAodHJpZ2dlclNwZWMucm9vdCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMucm9vdCA9IHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0cmlnZ2VyU3BlYy5yb290KVxuICAgICAgfVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocmVzaG9sZCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMudGhyZXNob2xkID0gcGFyc2VGbG9hdCh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpXG4gICAgICB9XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlbnRyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXVxuICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2ludGVyc2VjdCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgb2JzZXJ2ZXJPcHRpb25zKVxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShhc0VsZW1lbnQoZWx0KSlcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdsb2FkJykge1xuICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIG1ha2VFdmVudCgnbG9hZCcsIHsgZWx0IH0pKSkge1xuICAgICAgICBsb2FkSW1tZWRpYXRlbHkoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnBvbGxJbnRlcnZhbCA+IDApIHtcbiAgICAgIG5vZGVEYXRhLnBvbGxpbmcgPSB0cnVlXG4gICAgICBwcm9jZXNzUG9sbGluZyhhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3NIeE9uKG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbHQuYXR0cmlidXRlc1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdLm5hbWVcbiAgICAgIGlmIChzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb246JykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb246JykgfHxcbiAgICAgICAgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uLScpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uLScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBjb25zdCBIWF9PTl9RVUVSWSA9IG5ldyBYUGF0aEV2YWx1YXRvcigpXG4gICAgLmNyZWF0ZUV4cHJlc3Npb24oJy4vLypbQCpbIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbjpcIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb246XCIpIG9yJyArXG4gICAgICAnIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbi1cIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb24tXCIpIF1dJylcblxuICBmdW5jdGlvbiBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cykge1xuICAgIGlmIChzaG91bGRQcm9jZXNzSHhPbihlbHQpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChlbHQpKVxuICAgIH1cbiAgICBjb25zdCBpdGVyID0gSFhfT05fUVVFUlkuZXZhbHVhdGUoZWx0KVxuICAgIGxldCBub2RlID0gbnVsbFxuICAgIHdoaWxlIChub2RlID0gaXRlci5pdGVyYXRlTmV4dCgpKSBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChub2RlKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpIHtcbiAgICAvKiogQHR5cGUge0VsZW1lbnRbXX0gKi9cbiAgICBjb25zdCBlbGVtZW50cyA9IFtdXG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWx0LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgcHJvY2Vzc0hYT25Sb290KGNoaWxkLCBlbGVtZW50cylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpXG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCkge1xuICAgIGlmIChlbHQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgY29uc3QgYm9vc3RlZFNlbGVjdG9yID0gJywgW2h4LWJvb3N0XSBhLCBbZGF0YS1oeC1ib29zdF0gYSwgYVtoeC1ib29zdF0sIGFbZGF0YS1oeC1ib29zdF0nXG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvblNlbGVjdG9ycyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGUgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2VdXG4gICAgICAgIGlmIChleHRlbnNpb24uZ2V0U2VsZWN0b3JzKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMoKVxuICAgICAgICAgIGlmIChzZWxlY3RvcnMpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvblNlbGVjdG9ycy5wdXNoKHNlbGVjdG9ycylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGVsdC5xdWVyeVNlbGVjdG9yQWxsKFZFUkJfU0VMRUNUT1IgKyBib29zdGVkU2VsZWN0b3IgKyBcIiwgZm9ybSwgW3R5cGU9J3N1Ym1pdCddLFwiICtcbiAgICAgICAgJyBbaHgtZXh0XSwgW2RhdGEtaHgtZXh0XSwgW2h4LXRyaWdnZXJdLCBbZGF0YS1oeC10cmlnZ2VyXScgKyBleHRlbnNpb25TZWxlY3RvcnMuZmxhdCgpLm1hcChzID0+ICcsICcgKyBzKS5qb2luKCcnKSlcblxuICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICogc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gKi8gKGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIikpXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBlbHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIilcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGZvcm0gPSByZXNvbHZlVGFyZ2V0KCcjJyArIGdldFJhd0F0dHJpYnV0ZShlbHQsICdmb3JtJyksIGVsdC5nZXRSb290Tm9kZSgpKSB8fCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKVxuICAgIGlmICghZm9ybSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXRCdXR0b25UcmFja2luZyhlbHQpIHtcbiAgICAvLyBuZWVkIHRvIGhhbmRsZSBib3RoIGNsaWNrIGFuZCBmb2N1cyBpbjpcbiAgICAvLyAgIGZvY3VzaW4gLSBpbiBjYXNlIHNvbWVvbmUgdGFicyBpbiB0byBhIGJ1dHRvbiBhbmQgaGl0cyB0aGUgc3BhY2UgYmFyXG4gICAgLy8gICBjbGljayAtIG9uIE9TWCBidXR0b25zIGRvIG5vdCBmb2N1cyBvbiBjbGljayBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzI0XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGVcbiAgICovXG4gIGZ1bmN0aW9uIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIGNvZGUpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGVEYXRhLm9uSGFuZGxlcnMpKSB7XG4gICAgICBub2RlRGF0YS5vbkhhbmRsZXJzID0gW11cbiAgICB9XG4gICAgbGV0IGZ1bmNcbiAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICBmdW5jID0gbmV3IEZ1bmN0aW9uKCdldmVudCcsIGNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgZnVuYy5jYWxsKGVsdCwgZSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgbm9kZURhdGEub25IYW5kbGVycy5wdXNoKHsgZXZlbnQ6IGV2ZW50TmFtZSwgbGlzdGVuZXIgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0h4T25XaWxkY2FyZChlbHQpIHtcbiAgICAvLyB3aXBlIGFueSBwcmV2aW91cyBvbiBoYW5kbGVycyBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMgcHJlY2VkZW5jZVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWx0KVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGNvbnN0IHZhbHVlID0gZWx0LmF0dHJpYnV0ZXNbaV0udmFsdWVcbiAgICAgIGlmIChzdGFydHNXaXRoKG5hbWUsICdoeC1vbicpIHx8IHN0YXJ0c1dpdGgobmFtZSwgJ2RhdGEtaHgtb24nKSkge1xuICAgICAgICBjb25zdCBhZnRlck9uUG9zaXRpb24gPSBuYW1lLmluZGV4T2YoJy1vbicpICsgM1xuICAgICAgICBjb25zdCBuZXh0Q2hhciA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uLCBhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICBpZiAobmV4dENoYXIgPT09ICctJyB8fCBuZXh0Q2hhciA9PT0gJzonKSB7XG4gICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgICAvLyBpZiB0aGUgZXZlbnROYW1lIHN0YXJ0cyB3aXRoIGEgY29sb24gb3IgZGFzaCwgcHJlcGVuZCBcImh0bXhcIiBmb3Igc2hvcnRoYW5kIHN1cHBvcnRcbiAgICAgICAgICBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICc6JykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14JyArIGV2ZW50TmFtZVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICctJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoMSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnaHRteC0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSg1KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXROb2RlKGVsdCkge1xuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAobm9kZURhdGEuaW5pdEhhc2ggIT09IGF0dHJpYnV0ZUhhc2goZWx0KSkge1xuICAgICAgLy8gY2xlYW4gdXAgYW55IHByZXZpb3VzbHkgcHJvY2Vzc2VkIGluZm9cbiAgICAgIGRlSW5pdE5vZGUoZWx0KVxuXG4gICAgICBub2RlRGF0YS5pbml0SGFzaCA9IGF0dHJpYnV0ZUhhc2goZWx0KVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpXG5cbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgaWYgKGVsdC52YWx1ZSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG5vZGVEYXRhLmxhc3RWYWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBnZXRUcmlnZ2VyU3BlY3MoZWx0KVxuICAgICAgY29uc3QgaGFzRXhwbGljaXRIdHRwQWN0aW9uID0gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcblxuICAgICAgaWYgKCFoYXNFeHBsaWNpdEh0dHBBY3Rpb24pIHtcbiAgICAgICAgaWYgKGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1ib29zdCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuICAgICAgICB9IGVsc2UgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC10cmlnZ2VyJykpIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgICAgLy8gRm9yIFwibmFrZWRcIiB0cmlnZ2VycywgZG9uJ3QgZG8gYW55dGhpbmcgYXQgYWxsXG4gICAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nIHx8IChnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JyAmJiBoYXNBdHRyaWJ1dGUoZWx0LCAnZm9ybScpKSkge1xuICAgICAgICBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclByb2Nlc3NOb2RlJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIG5ldyBjb250ZW50LCBlbmFibGluZyBodG14IGJlaGF2aW9yLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgY29udGVudCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBET00gb3V0c2lkZSBvZiB0aGUgbm9ybWFsIGh0bXggcmVxdWVzdCBjeWNsZSBidXQgc3RpbGwgd2FudCBodG14IGF0dHJpYnV0ZXMgdG8gd29yay5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcHJvY2Vzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgZWxlbWVudCB0byBwcm9jZXNzXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShlbHQpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpbml0Tm9kZShlbHQpXG4gICAgZm9yRWFjaChmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSwgZnVuY3Rpb24oY2hpbGQpIHsgaW5pdE5vZGUoY2hpbGQpIH0pXG4gICAgZm9yRWFjaChmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSwgcHJvY2Vzc0h4T25XaWxkY2FyZClcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV2ZW50L0xvZyBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRldGFpbFxuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgLy8gVGhpcyBicmVha3MgZXhwZWN0ZWQgZW5jYXBzdWxhdGlvbiBidXQgbmVlZHMgdG8gYmUgaGVyZSB1bnRpbCBkZWNpZGVkIG90aGVyd2lzZSBieSBjb3JlIGRldnNcbiAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBldnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsXG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXJyb3JFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZXZlbnROYW1lIH0sIGRldGFpbCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpIHtcbiAgICByZXR1cm4gZXZlbnROYW1lID09PSAnaHRteDphZnRlclByb2Nlc3NOb2RlJ1xuICB9XG5cbiAgLyoqXG4gICAqIGB3aXRoRXh0ZW5zaW9uc2AgbG9jYXRlcyBhbGwgYWN0aXZlIGV4dGVuc2lvbnMgZm9yIGEgcHJvdmlkZWQgZWxlbWVudCwgdGhlblxuICAgKiBleGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdXNpbmcgZWFjaCBvZiB0aGUgYWN0aXZlIGV4dGVuc2lvbnMuICBJdCBzaG91bGRcbiAgICogYmUgY2FsbGVkIGludGVybmFsbHkgYXQgZXZlcnkgZXh0ZW5kYWJsZSBleGVjdXRpb24gcG9pbnQgaW4gaHRteC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHsoZXh0ZW5zaW9uOkh0bXhFeHRlbnNpb24pID0+IHZvaWR9IHRvRG9cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aEV4dGVuc2lvbnMoZWx0LCB0b0RvKSB7XG4gICAgZm9yRWFjaChnZXRFeHRlbnNpb25zKGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9EbyhleHRlbnNpb24pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ0Vycm9yKG1zZykge1xuICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1zZylcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICBjb25zb2xlLmxvZygnRVJST1I6ICcsIG1zZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBnaXZlbiBldmVudCBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RyaWdnZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byB0cmlnZ2VyXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsIGRldGFpbHMgZm9yIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRldGFpbCA9PSBudWxsKSB7XG4gICAgICBkZXRhaWwgPSB7fVxuICAgIH1cbiAgICBkZXRhaWwuZWx0ID0gZWx0XG4gICAgY29uc3QgZXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgaWYgKGh0bXgubG9nZ2VyICYmICFpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSkge1xuICAgICAgaHRteC5sb2dnZXIoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICB9XG4gICAgaWYgKGRldGFpbC5lcnJvcikge1xuICAgICAgbG9nRXJyb3IoZGV0YWlsLmVycm9yKVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6ZXJyb3InLCB7IGVycm9ySW5mbzogZGV0YWlsIH0pXG4gICAgfVxuICAgIGxldCBldmVudFJlc3VsdCA9IGVsdC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGtlYmFiTmFtZSA9IGtlYmFiRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAgICBpZiAoZXZlbnRSZXN1bHQgJiYga2ViYWJOYW1lICE9PSBldmVudE5hbWUpIHtcbiAgICAgIGNvbnN0IGtlYmFiZWRFdmVudCA9IG1ha2VFdmVudChrZWJhYk5hbWUsIGV2ZW50LmRldGFpbClcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgZWx0LmRpc3BhdGNoRXZlbnQoa2ViYWJlZEV2ZW50KVxuICAgIH1cbiAgICB3aXRoRXh0ZW5zaW9ucyhhc0VsZW1lbnQoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIChleHRlbnNpb24ub25FdmVudChldmVudE5hbWUsIGV2ZW50KSAhPT0gZmFsc2UgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgfSlcbiAgICByZXR1cm4gZXZlbnRSZXN1bHRcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhpc3RvcnkgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsZXQgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAvKipcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRIaXN0b3J5RWxlbWVudCgpIHtcbiAgICBjb25zdCBoaXN0b3J5RWx0ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpXG4gICAgcmV0dXJuIGhpc3RvcnlFbHQgfHwgZ2V0RG9jdW1lbnQoKS5ib2R5XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbHRcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVUb0hpc3RvcnlDYWNoZSh1cmwsIHJvb3RFbHQpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgc3RhdGUgdG8gc2F2ZVxuICAgIGNvbnN0IGlubmVySFRNTCA9IGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShyb290RWx0KVxuICAgIGNvbnN0IHRpdGxlID0gZ2V0RG9jdW1lbnQoKS50aXRsZVxuICAgIGNvbnN0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSA8PSAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbiBldmVudHVhbGx5IGFscmVhZHkgZXhpc3RpbmcgY2FjaGUgaXMgcHVyZ2VkXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICBoaXN0b3J5Q2FjaGUuc3BsaWNlKGksIDEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIEh0bXhIaXN0b3J5SXRlbSAqL1xuICAgIGNvbnN0IG5ld0hpc3RvcnlJdGVtID0geyB1cmwsIGNvbnRlbnQ6IGlubmVySFRNTCwgdGl0bGUsIHNjcm9sbCB9XG5cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5SXRlbUNyZWF0ZWQnLCB7IGl0ZW06IG5ld0hpc3RvcnlJdGVtLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG5cbiAgICBoaXN0b3J5Q2FjaGUucHVzaChuZXdIaXN0b3J5SXRlbSlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUpIHtcbiAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpXG4gICAgfVxuXG4gICAgLy8ga2VlcCB0cnlpbmcgdG8gc2F2ZSB0aGUgY2FjaGUgdW50aWwgaXQgc3VjY2VlZHMgb3IgaXMgZW1wdHlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5Q2FjaGUpKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZUVycm9yJywgeyBjYXVzZTogZSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuICAgICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKSAvLyBzaHJpbmsgdGhlIGNhY2hlIGFuZCByZXRyeVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeUl0ZW1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNjcm9sbFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcmV0dXJucyB7SHRteEhpc3RvcnlJdGVtfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDYWNoZWRIaXN0b3J5KHVybCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIHJldHVybiBoaXN0b3J5Q2FjaGVbaV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KGVsdCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGh0bXguY29uZmlnLnJlcXVlc3RDbGFzc1xuICAgIGNvbnN0IGNsb25lID0gLyoqIEB0eXBlIEVsZW1lbnQgKi8gKGVsdC5jbG9uZU5vZGUodHJ1ZSkpXG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnLicgKyBjbGFzc05hbWUpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhc3NOYW1lKVxuICAgIH0pXG4gICAgLy8gcmVtb3ZlIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgZm9yIGFueSBlbGVtZW50IGRpc2FibGVkIGR1ZSB0byBhbiBodG14IHJlcXVlc3RcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICdbZGF0YS1kaXNhYmxlZC1ieS1odG14XScpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgfSlcbiAgICByZXR1cm4gY2xvbmUuaW5uZXJIVE1MXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKSB7XG4gICAgY29uc3QgZWx0ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50UGF0aEZvckhpc3RvcnkgfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAgIC8vIEFsbG93IGhpc3Rvcnkgc25hcHNob3QgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCB3aGVyZSBoeC1oaXN0b3J5PVwiZmFsc2VcIlxuICAgIC8vIGlzIHByZXNlbnQgKmFueXdoZXJlKiBpbiB0aGUgY3VycmVudCBkb2N1bWVudCB3ZSdyZSBhYm91dCB0byBzYXZlLFxuICAgIC8vIHNvIHdlIGNhbiBwcmV2ZW50IHByaXZpbGVnZWQgZGF0YSBlbnRlcmluZyB0aGUgY2FjaGUuXG4gICAgLy8gVGhlIHBhZ2Ugd2lsbCBzdGlsbCBiZSByZWFjaGFibGUgYXMgYSBoaXN0b3J5IGVudHJ5LCBidXQgaHRteCB3aWxsIGZldGNoIGl0XG4gICAgLy8gbGl2ZSBmcm9tIHRoZSBzZXJ2ZXIgb25wb3BzdGF0ZSByYXRoZXIgdGhhbiBsb29rIGluIHRoZSBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICBsZXQgZGlzYWJsZUhpc3RvcnlDYWNoZVxuICAgIHRyeSB7XG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0nKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJRTExOiBpbnNlbnNpdGl2ZSBtb2RpZmllciBub3Qgc3VwcG9ydGVkIHNvIGZhbGxiYWNrIHRvIGNhc2Ugc2Vuc2l0aXZlIHNlbGVjdG9yXG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCJdLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiXScpXG4gICAgfVxuICAgIGlmICghZGlzYWJsZUhpc3RvcnlDYWNoZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVNhdmUnLCB7IHBhdGgsIGhpc3RvcnlFbHQ6IGVsdCB9KVxuICAgICAgc2F2ZVRvSGlzdG9yeUNhY2hlKHBhdGgsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCBnZXREb2N1bWVudCgpLnRpdGxlLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcHVzaFVybEludG9IaXN0b3J5KHBhdGgpIHtcbiAgLy8gcmVtb3ZlIHRoZSBjYWNoZSBidXN0ZXIgcGFyYW1ldGVyLCBpZiBhbnlcbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvb3JnXFwuaHRteFxcLmNhY2hlLWJ1c3Rlcj1bXiZdKiY/LywgJycpXG4gICAgICBpZiAoZW5kc1dpdGgocGF0aCwgJyYnKSB8fCBlbmRzV2l0aChwYXRoLCAnPycpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIHtcbiAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICB9XG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlVXJsSW5IaXN0b3J5KHBhdGgpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0dGxlSW1tZWRpYXRlbHkodGFza3MpIHtcbiAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICB0YXNrLmNhbGwodW5kZWZpbmVkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgY29uc3QgZGV0YWlscyA9IHsgcGF0aCwgeGhyOiByZXF1ZXN0IH1cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzJywgZGV0YWlscylcbiAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1DdXJyZW50LVVSTCcsIGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZilcbiAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZCcsIGRldGFpbHMpXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KHRoaXMucmVzcG9uc2UpXG4gICAgICAgIC8qKiBAdHlwZSBQYXJlbnROb2RlICovXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpIHx8IGZyYWdtZW50XG4gICAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuXG4gICAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGNvbnRlbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGNhY2hlTWlzczogdHJ1ZSwgc2VydmVyUmVzcG9uc2U6IHRoaXMucmVzcG9uc2UgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWRFcnJvcicsIGRldGFpbHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3Quc2VuZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzdG9yZUhpc3RvcnkocGF0aCkge1xuICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgcGF0aCA9IHBhdGggfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRIaXN0b3J5KHBhdGgpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY2FjaGVkLmNvbnRlbnQpXG4gICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGNhY2hlZC5zY3JvbGwpXG4gICAgICB9LCAwKSAvLyBuZXh0ICd0aWNrJywgc28gYnJvd3NlciBoYXMgdGltZSB0byByZW5kZXIgbGF5b3V0XG4gICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgaXRlbTogY2FjaGVkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5yZWZyZXNoT25IaXN0b3J5TWlzcykge1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gcmVsb2FkKCkgZnVuY3Rpb24gdGhyb3dzIGVycm9yXG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpIHtcbiAgICBsZXQgaW5kaWNhdG9ycyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluZGljYXRvcicpKVxuICAgIGlmIChpbmRpY2F0b3JzID09IG51bGwpIHtcbiAgICAgIGluZGljYXRvcnMgPSBbZWx0XVxuICAgIH1cbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBpYy5jbGFzc0xpc3QuYWRkLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgfSlcbiAgICByZXR1cm4gaW5kaWNhdG9yc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBkaXNhYmxlRWxlbWVudHMoZWx0KSB7XG4gICAgbGV0IGRpc2FibGVkRWx0cyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWRpc2FibGVkLWVsdCcpKVxuICAgIGlmIChkaXNhYmxlZEVsdHMgPT0gbnVsbCkge1xuICAgICAgZGlzYWJsZWRFbHRzID0gW11cbiAgICB9XG4gICAgZm9yRWFjaChkaXNhYmxlZEVsdHMsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnLCAnJylcbiAgICB9KVxuICAgIHJldHVybiBkaXNhYmxlZEVsdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gaW5kaWNhdG9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVkKSB7XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgaWMuY2xhc3NMaXN0LnJlbW92ZS5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChkaXNhYmxlZCwgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnB1dCBWYWx1ZSBQcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IHByb2Nlc3NlZFtpXVxuICAgICAgaWYgKG5vZGUuaXNTYW1lTm9kZShlbHQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkSW5jbHVkZShlbGVtZW50KSB7XG4gICAgLy8gQ2FzdCB0byB0cmljayB0c2MsIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCB3b3JrIGZpbmUgaGVyZVxuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudH0gKi8gKGVsZW1lbnQpXG4gICAgaWYgKGVsdC5uYW1lID09PSAnJyB8fCBlbHQubmFtZSA9PSBudWxsIHx8IGVsdC5kaXNhYmxlZCB8fCBjbG9zZXN0KGVsdCwgJ2ZpZWxkc2V0W2Rpc2FibGVkXScpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgLy8gaWdub3JlIFwic3VibWl0dGVyXCIgdHlwZXMgKHNlZSBqUXVlcnkgc3JjL3NlcmlhbGl6ZS5qcylcbiAgICBpZiAoZWx0LnR5cGUgPT09ICdidXR0b24nIHx8IGVsdC50eXBlID09PSAnc3VibWl0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ltYWdlJyB8fCBlbHQudGFnTmFtZSA9PT0gJ3Jlc2V0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGVsdC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsdC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm4gZWx0LmNoZWNrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheXxGb3JtRGF0YUVudHJ5VmFsdWV9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxldCB2YWx1ZXMgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdmFsdWUuaW5kZXhPZih2KSA8IDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpXG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgIGZvckVhY2godmFsdWVzLCB2ID0+IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudHxIVE1MU2VsZWN0RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpIHtcbiAgICBpZiAoZWx0ID09IG51bGwgfHwgaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NlZC5wdXNoKGVsdClcbiAgICB9XG4gICAgaWYgKHNob3VsZEluY2x1ZGUoZWx0KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJylcbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgbGV0IHZhbHVlID0gZWx0LnZhbHVlXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgZWx0Lm11bHRpcGxlKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uOmNoZWNrZWQnKSkubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuICgvKiogQHR5cGUgSFRNTE9wdGlvbkVsZW1lbnQgKi8oZSkpLnZhbHVlIH0pXG4gICAgICB9XG4gICAgICAvLyBpbmNsdWRlIGZpbGUgaW5wdXRzXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbHQuZmlsZXMpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5maWxlcylcbiAgICAgIH1cbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGVsdC5lbGVtZW50cywgZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHByb2Nlc3NlZC5pbmRleE9mKGlucHV0KSA+PSAwKSB7XG4gICAgICAgICAgLy8gVGhlIGlucHV0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZCBhZGRlZCB0byB0aGUgdmFsdWVzLCBidXQgdGhlIEZvcm1EYXRhIHRoYXQgd2lsbCBiZVxuICAgICAgICAgIC8vICBjb25zdHJ1Y3RlZCByaWdodCBhZnRlciBvbiB0aGUgZm9ybSwgd2lsbCBpbmNsdWRlIGl0IG9uY2UgYWdhaW4uIFNvIHJlbW92ZSB0aGF0IGlucHV0J3MgdmFsdWVcbiAgICAgICAgICAvLyAgbm93IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShpbnB1dC5uYW1lLCBpbnB1dC52YWx1ZSwgZm9ybURhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1c2goaW5wdXQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgICAgdmFsaWRhdGVFbGVtZW50KGlucHV0LCBlcnJvcnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBuZXcgRm9ybURhdGEoZWx0KS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgJiYgdmFsdWUubmFtZSA9PT0gJycpIHtcbiAgICAgICAgICByZXR1cm4gLy8gaWdub3JlIG5vLW5hbWUgZmlsZXNcbiAgICAgICAgfVxuICAgICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICovXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50ICYgRWxlbWVudEludGVybmFsc30gKi8gKGVsdClcbiAgICBpZiAoZWxlbWVudC53aWxsVmFsaWRhdGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOnZhbGlkYXRlJylcbiAgICAgIGlmICghZWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBlbHQ6IGVsZW1lbnQsIG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOmZhaWxlZCcsIHsgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBvbmUgRm9ybURhdGEgd2l0aCB0aG9zZSBmcm9tIGFub3RoZXIuXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IHJlY2VpdmVyIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBkb25vciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIG92ZXJyaWRpbmcgdmFsdWVzXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX0gdGhlIHtAbGlua2NvZGUgcmVjZWl2ZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvdmVycmlkZUZvcm1EYXRhKHJlY2VpdmVyLCBkb25vcikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGRvbm9yLmtleXMoKSkge1xuICAgICAgcmVjZWl2ZXIuZGVsZXRlKGtleSlcbiAgICB9XG4gICAgZG9ub3IuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZWNlaXZlci5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZWNlaXZlclxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEByZXR1cm5zIHt7ZXJyb3JzOiBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdLCBmb3JtRGF0YTogRm9ybURhdGEsIHZhbHVlczogT2JqZWN0fX1cbiAqL1xuICBmdW5jdGlvbiBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpIHtcbiAgICAvKiogQHR5cGUgRWxlbWVudFtdICovXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gW11cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgY29uc3QgcHJpb3JpdHlGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgLyoqIEB0eXBlIEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCAmJiAhYm9keUNvbnRhaW5zKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBvbmx5IHZhbGlkYXRlIHdoZW4gZm9ybSBpcyBkaXJlY3RseSBzdWJtaXR0ZWQgYW5kIG5vdmFsaWRhdGUgb3IgZm9ybW5vdmFsaWRhdGUgYXJlIG5vdCBzZXRcbiAgICAvLyBvciBpZiB0aGUgZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgaHgtdmFsaWRhdGU9XCJ0cnVlXCIgb24gaXRcbiAgICBsZXQgdmFsaWRhdGUgPSAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmIGVsdC5ub1ZhbGlkYXRlICE9PSB0cnVlKSB8fCBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC12YWxpZGF0ZScpID09PSAndHJ1ZSdcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSB7XG4gICAgICB2YWxpZGF0ZSA9IHZhbGlkYXRlICYmIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZC5mb3JtTm9WYWxpZGF0ZSAhPT0gdHJ1ZVxuICAgIH1cblxuICAgIC8vIGZvciBhIG5vbi1HRVQgaW5jbHVkZSB0aGUgY2xvc2VzdCBmb3JtXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIHByaW9yaXR5Rm9ybURhdGEsIGVycm9ycywgY2xvc2VzdChlbHQsICdmb3JtJyksIHZhbGlkYXRlKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKVxuXG4gICAgLy8gaWYgYSBidXR0b24gb3Igc3VibWl0IHdhcyBjbGlja2VkIGxhc3QsIGluY2x1ZGUgaXRzIHZhbHVlXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCBlbHQudGFnTmFtZSA9PT0gJ0JVVFRPTicgfHxcbiAgICAoZWx0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcpKSB7XG4gICAgICBjb25zdCBidXR0b24gPSBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgKC8qKiBAdHlwZSBIVE1MSW5wdXRFbGVtZW50fEhUTUxCdXR0b25FbGVtZW50ICovKGVsdCkpXG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGJ1dHRvbiwgJ25hbWUnKVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIGJ1dHRvbi52YWx1ZSwgcHJpb3JpdHlGb3JtRGF0YSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIGFueSBleHBsaWNpdCBpbmNsdWRlc1xuICAgIGNvbnN0IGluY2x1ZGVzID0gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5jbHVkZScpXG4gICAgZm9yRWFjaChpbmNsdWRlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBhc0VsZW1lbnQobm9kZSksIHZhbGlkYXRlKVxuICAgICAgLy8gaWYgYSBub24tZm9ybSBpcyBpbmNsdWRlZCwgaW5jbHVkZSBhbnkgaW5wdXQgdmFsdWVzIHdpdGhpbiBpdFxuICAgICAgaWYgKCFtYXRjaGVzKG5vZGUsICdmb3JtJykpIHtcbiAgICAgICAgZm9yRWFjaChhc1BhcmVudE5vZGUobm9kZSkucXVlcnlTZWxlY3RvckFsbChJTlBVVF9TRUxFQ1RPUiksIGZ1bmN0aW9uKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGRlc2NlbmRhbnQsIHZhbGlkYXRlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyB2YWx1ZXMgZnJvbSBhIDxmb3JtPiB0YWtlIHByZWNlZGVuY2UsIG92ZXJyaWRpbmcgdGhlIHJlZ3VsYXIgdmFsdWVzXG4gICAgb3ZlcnJpZGVGb3JtRGF0YShmb3JtRGF0YSwgcHJpb3JpdHlGb3JtRGF0YSlcblxuICAgIHJldHVybiB7IGVycm9ycywgZm9ybURhdGEsIHZhbHVlczogZm9ybURhdGFQcm94eShmb3JtRGF0YSkgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXR1cm5TdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHthbnl9IHJlYWxWYWx1ZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBuYW1lLCByZWFsVmFsdWUpIHtcbiAgICBpZiAocmV0dXJuU3RyICE9PSAnJykge1xuICAgICAgcmV0dXJuU3RyICs9ICcmJ1xuICAgIH1cbiAgICBpZiAoU3RyaW5nKHJlYWxWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZWFsVmFsdWUgPSBKU09OLnN0cmluZ2lmeShyZWFsVmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IHMgPSBlbmNvZGVVUklDb21wb25lbnQocmVhbFZhbHVlKVxuICAgIHJldHVyblN0ciArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBzXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF8T2JqZWN0fSB2YWx1ZXNcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBmdW5jdGlvbiB1cmxFbmNvZGUodmFsdWVzKSB7XG4gICAgdmFsdWVzID0gZm9ybURhdGFGcm9tT2JqZWN0KHZhbHVlcylcbiAgICBsZXQgcmV0dXJuU3RyID0gJydcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm5TdHIgPSBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBamF4XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9tcHRcbiAqIEByZXR1cm5zIHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHQpIHtcbiAgICAvKiogQHR5cGUgSHRteEhlYWRlclNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgJ0hYLVJlcXVlc3QnOiAndHJ1ZScsXG4gICAgICAnSFgtVHJpZ2dlcic6IGdldFJhd0F0dHJpYnV0ZShlbHQsICdpZCcpLFxuICAgICAgJ0hYLVRyaWdnZXItTmFtZSc6IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJyksXG4gICAgICAnSFgtVGFyZ2V0JzogZ2V0QXR0cmlidXRlVmFsdWUodGFyZ2V0LCAnaWQnKSxcbiAgICAgICdIWC1DdXJyZW50LVVSTCc6IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cbiAgICBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LWhlYWRlcnMnLCBmYWxzZSwgaGVhZGVycylcbiAgICBpZiAocHJvbXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLVByb21wdCddID0gcHJvbXB0XG4gICAgfVxuICAgIGlmIChnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Cb29zdGVkJ10gPSAndHJ1ZSdcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIC8qKlxuICogZmlsdGVyVmFsdWVzIHRha2VzIGFuIG9iamVjdCBjb250YWluaW5nIGZvcm0gaW5wdXQgdmFsdWVzXG4gKiBhbmQgcmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBvbmx5IGNvbnRhaW5zIGtleXMgdGhhdCBhcmVcbiAqIHNwZWNpZmllZCBieSB0aGUgY2xvc2VzdCBcImh4LXBhcmFtc1wiIGF0dHJpYnV0ZVxuICogQHBhcmFtIHtGb3JtRGF0YX0gaW5wdXRWYWx1ZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZmlsdGVyVmFsdWVzKGlucHV0VmFsdWVzLCBlbHQpIHtcbiAgICBjb25zdCBwYXJhbXNWYWx1ZSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wYXJhbXMnKVxuICAgIGlmIChwYXJhbXNWYWx1ZSkge1xuICAgICAgaWYgKHBhcmFtc1ZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlLmluZGV4T2YoJ25vdCAnKSA9PT0gMCkge1xuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnN1YnN0cig0KS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaW5wdXRWYWx1ZXMuZGVsZXRlKG5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaWYgKGlucHV0VmFsdWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZXMuZ2V0QWxsKG5hbWUpLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHsgbmV3VmFsdWVzLmFwcGVuZChuYW1lLCB2YWx1ZSkgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBuZXdWYWx1ZXNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0FuY2hvckxpbmsoZWx0KSB7XG4gICAgcmV0dXJuICEhZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSA+PSAwXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IFtzd2FwSW5mb092ZXJyaWRlXVxuICogQHJldHVybnMge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBJbmZvT3ZlcnJpZGUpIHtcbiAgICBjb25zdCBzd2FwSW5mbyA9IHN3YXBJbmZvT3ZlcnJpZGUgfHwgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN3YXAnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBzd2FwU3BlYyA9IHtcbiAgICAgIHN3YXBTdHlsZTogZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCA/ICdpbm5lckhUTUwnIDogaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSxcbiAgICAgIHN3YXBEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFN3YXBEZWxheSxcbiAgICAgIHNldHRsZURlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U2V0dGxlRGVsYXlcbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLnNjcm9sbEludG9WaWV3T25Cb29zdCAmJiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmICFpc0FuY2hvckxpbmsoZWx0KSkge1xuICAgICAgc3dhcFNwZWMuc2hvdyA9ICd0b3AnXG4gICAgfVxuICAgIGlmIChzd2FwSW5mbykge1xuICAgICAgY29uc3Qgc3BsaXQgPSBzcGxpdE9uV2hpdGVzcGFjZShzd2FwSW5mbylcbiAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNwbGl0W2ldXG4gICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ3N3YXA6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDUpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2V0dGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zZXR0bGVEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDcpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZigndHJhbnNpdGlvbjonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMudHJhbnNpdGlvbiA9IHZhbHVlLnN1YnN0cigxMSkgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignaWdub3JlVGl0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gdmFsdWUuc3Vic3RyKDEyKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFNwZWMgPSB2YWx1ZS5zdWJzdHIoNylcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzY3JvbGxTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsID0gc2Nyb2xsVmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGxUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2hvdzonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2hvd1NwZWMgPSB2YWx1ZS5zdWJzdHIoNSlcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzaG93U3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzaG93VmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93ID0gc2hvd1ZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvd1RhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdmb2N1cy1zY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzU2Nyb2xsVmFsID0gdmFsdWUuc3Vic3RyKCdmb2N1cy1zY3JvbGw6Jy5sZW5ndGgpXG4gICAgICAgICAgICBzd2FwU3BlYy5mb2N1c1Njcm9sbCA9IGZvY3VzU2Nyb2xsVmFsID09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwU3R5bGUgPSB2YWx1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dFcnJvcignVW5rbm93biBtb2RpZmllciBpbiBoeC1zd2FwOiAnICsgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3BlY1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB1c2VzRm9ybURhdGEoZWx0KSB7XG4gICAgcmV0dXJuIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1lbmNvZGluZycpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfHxcbiAgICAobWF0Y2hlcyhlbHQsICdmb3JtJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2VuY3R5cGUnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmaWx0ZXJlZFBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgeyp8c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZFBhcmFtZXRlcnMpIHtcbiAgICBsZXQgZW5jb2RlZFBhcmFtZXRlcnMgPSBudWxsXG4gICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyA9PSBudWxsKSB7XG4gICAgICAgIGVuY29kZWRQYXJhbWV0ZXJzID0gZXh0ZW5zaW9uLmVuY29kZVBhcmFtZXRlcnMoeGhyLCBmaWx0ZXJlZFBhcmFtZXRlcnMsIGVsdClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5jb2RlZFBhcmFtZXRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbnZlcnNpb24gdG8gYW4gYWN0dWFsIEZvcm1EYXRhIG9iamVjdCBpbiBjYXNlIGZpbHRlcmVkUGFyYW1ldGVycyBpcyBhIGZvcm1EYXRhUHJveHlcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14L2lzc3Vlcy8yMzE3XG4gICAgICAgIHJldHVybiBvdmVycmlkZUZvcm1EYXRhKG5ldyBGb3JtRGF0YSgpLCBmb3JtRGF0YUZyb21PYmplY3QoZmlsdGVyZWRQYXJhbWV0ZXJzKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmxFbmNvZGUoZmlsdGVyZWRQYXJhbWV0ZXJzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7SHRteFNldHRsZUluZm99XG4gKi9cbiAgZnVuY3Rpb24gbWFrZVNldHRsZUluZm8odGFyZ2V0KSB7XG4gICAgcmV0dXJuIHsgdGFza3M6IFtdLCBlbHRzOiBbdGFyZ2V0XSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxTdGF0ZShjb250ZW50LCBzd2FwU3BlYykge1xuICAgIGNvbnN0IGZpcnN0ID0gY29udGVudFswXVxuICAgIGNvbnN0IGxhc3QgPSBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV1cbiAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbFRhcmdldCkge1xuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gMFxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gdGFyZ2V0LnNjcm9sbEhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3dhcFNwZWMuc2hvdykge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0KSB7XG4gICAgICAgIGxldCB0YXJnZXRTdHIgPSBzd2FwU3BlYy5zaG93VGFyZ2V0XG4gICAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0ID09PSAnd2luZG93Jykge1xuICAgICAgICAgIHRhcmdldFN0ciA9ICdib2R5J1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCB0YXJnZXRTdHIpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBldmFsQXNEZWZhdWx0XG4gKiBAcGFyYW0ge09iamVjdD19IHZhbHVlc1xuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICB2YWx1ZXMgPSB7fVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZXNcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgICBsZXQgc3RyID0gYXR0cmlidXRlVmFsdWUudHJpbSgpXG4gICAgICBsZXQgZXZhbHVhdGVWYWx1ZSA9IGV2YWxBc0RlZmF1bHRcbiAgICAgIGlmIChzdHIgPT09ICd1bnNldCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDExKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdHIuaW5kZXhPZignanM6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigzKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCd7JykgIT09IDApIHtcbiAgICAgICAgc3RyID0gJ3snICsgc3RyICsgJ30nXG4gICAgICB9XG4gICAgICBsZXQgdmFyc1ZhbHVlc1xuICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkgeyByZXR1cm4gRnVuY3Rpb24oJ3JldHVybiAoJyArIHN0ciArICcpJykoKSB9LCB7fSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBwYXJzZUpTT04oc3RyKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFyc1ZhbHVlcykge1xuICAgICAgICBpZiAodmFyc1ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gdmFyc1ZhbHVlc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7KCkgPT4gYW55fSB0b0V2YWxcbiAgICogQHBhcmFtIHthbnk9fSBkZWZhdWx0VmFsXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUV2YWwoZWx0LCB0b0V2YWwsIGRlZmF1bHRWYWwpIHtcbiAgICBpZiAoaHRteC5jb25maWcuYWxsb3dFdmFsKSB7XG4gICAgICByZXR1cm4gdG9FdmFsKClcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpldmFsRGlzYWxsb3dlZEVycm9yJylcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFycycsIHRydWUsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFscycsIGZhbHNlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBnZXRFeHByZXNzaW9uVmFycyhlbHQpIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3RzKGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0KSwgZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGhlYWRlclZhbHVlXG4gICAqL1xuICBmdW5jdGlvbiBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpIHtcbiAgICBpZiAoaGVhZGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBPbiBhbiBleGNlcHRpb24sIHRyeSB0byBzZXQgdGhlIGhlYWRlciBVUkkgZW5jb2RlZCBpbnN0ZWFkXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgZW5jb2RlVVJJQ29tcG9uZW50KGhlYWRlclZhbHVlKSlcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyICsgJy1VUkktQXV0b0VuY29kZWQnLCAndHJ1ZScpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocikge1xuICAvLyBOQjogSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgc3R1ZmZcbiAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICYmIHR5cGVvZiAoVVJMKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoeGhyLnJlc3BvbnNlVVJMKVxuICAgICAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJhZFJlc3BvbnNlVXJsJywgeyB1cmw6IHhoci5yZXNwb25zZVVSTCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzSGVhZGVyKHhociwgcmVnZXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cC50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZXMgYW4gaHRteC1zdHlsZSBBSkFYIHJlcXVlc3RcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWpheFxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBVUkwgcGF0aCB0byBtYWtlIHRoZSBBSkFYXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd8SHRteEFqYXhIZWxwZXJDb250ZXh0fSBjb250ZXh0IHRoZSBlbGVtZW50IHRvIHRhcmdldCAoZGVmYXVsdHMgdG8gdGhlICoqYm9keSoqKSB8IGEgc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgfCBhIGNvbnRleHQgb2JqZWN0IHRoYXQgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmdcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5IGlmIG5vIHJlcXVlc3QgaXMgc2VudCwgb3Igd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgZnVuY3Rpb24gYWpheEhlbHBlcih2ZXJiLCBwYXRoLCBjb250ZXh0KSB7XG4gICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8odmVyYi50b0xvd2VyQ2FzZSgpKSlcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dCksXG4gICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgcmVzb2x2ZVRhcmdldChjb250ZXh0LnNvdXJjZSksIGNvbnRleHQuZXZlbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGFuZGxlcjogY29udGV4dC5oYW5kbGVyLFxuICAgICAgICAgICAgaGVhZGVyczogY29udGV4dC5oZWFkZXJzLFxuICAgICAgICAgICAgdmFsdWVzOiBjb250ZXh0LnZhbHVlcyxcbiAgICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQudGFyZ2V0KSxcbiAgICAgICAgICAgIHN3YXBPdmVycmlkZTogY29udGV4dC5zd2FwLFxuICAgICAgICAgICAgc2VsZWN0OiBjb250ZXh0LnNlbGVjdCxcbiAgICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGhpZXJhcmNoeUZvckVsdChlbHQpIHtcbiAgICBjb25zdCBhcnIgPSBbXVxuICAgIHdoaWxlIChlbHQpIHtcbiAgICAgIGFyci5wdXNoKGVsdClcbiAgICAgIGVsdCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB2ZXJpZnlQYXRoKGVsdCwgcGF0aCwgcmVxdWVzdENvbmZpZykge1xuICAgIGxldCBzYW1lSG9zdFxuICAgIGxldCB1cmxcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXJsID0gbmV3IFVSTChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKVxuICAgICAgY29uc3Qgb3JpZ2luID0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgICBzYW1lSG9zdCA9IG9yaWdpbiA9PT0gdXJsLm9yaWdpblxuICAgIH0gZWxzZSB7XG4gICAgLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgVVJMXG4gICAgICB1cmwgPSBwYXRoXG4gICAgICBzYW1lSG9zdCA9IHN0YXJ0c1dpdGgocGF0aCwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5zZWxmUmVxdWVzdHNPbmx5KSB7XG4gICAgICBpZiAoIXNhbWVIb3N0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGVVcmwnLCBtZXJnZU9iamVjdHMoeyB1cmwsIHNhbWVIb3N0IH0sIHJlcXVlc3RDb25maWcpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZvcm1EYXRhfSBvYmpcbiAgICogQHJldHVybiB7Rm9ybURhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvcm1EYXRhKSByZXR1cm4gb2JqXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0uZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9ialtrZXldLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgIShvYmpba2V5XSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgSlNPTi5zdHJpbmdpZnkob2JqW2tleV0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhQXJyYXlQcm94eShmb3JtRGF0YSwgbmFtZSwgYXJyYXkpIHtcbiAgICAvLyBtdXRhdGluZyB0aGUgYXJyYXkgc2hvdWxkIG11dGF0ZSB0aGUgdW5kZXJseWluZyBmb3JtIGRhdGFcbiAgICByZXR1cm4gbmV3IFByb3h5KGFycmF5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIGlmIChrZXkgPT09ICdsZW5ndGgnKSByZXR1cm4gdGFyZ2V0Lmxlbmd0aFxuICAgICAgICBpZiAoa2V5ID09PSAncHVzaCcpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpXG4gICAgICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldFtrZXldICYmIHRhcmdldFtrZXldLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFQcm94eShmb3JtRGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZm9ybURhdGEsIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHN5bWJvbCBjYWxscyB0byB0aGUgRm9ybURhdGEgaXRzZWxmIGRpcmVjdGx5XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgbmFtZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ3RvSlNPTicpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IEpTT04uc3RyaW5naWZ5IGNhbGwgb24gcHJveHlcbiAgICAgICAgICByZXR1cm4gKCkgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lIGluIHRhcmdldCkge1xuICAgICAgICAgIC8vIFdyYXAgaW4gZnVuY3Rpb24gd2l0aCBhcHBseSB0byBjb3JyZWN0bHkgYmluZCB0aGUgRm9ybURhdGEgY29udGV4dCwgYXMgYSBkaXJlY3QgY2FsbCB3b3VsZCByZXN1bHQgaW4gYW4gaWxsZWdhbCBpbnZvY2F0aW9uIGVycm9yXG4gICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcm1EYXRhW25hbWVdLmFwcGx5KGZvcm1EYXRhLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXkgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgICAgLy8gVGhvc2UgMiB1bmRlZmluZWQgJiBzaW5nbGUgdmFsdWUgcmV0dXJucyBhcmUgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkgYXMgd2Ugd2VyZW4ndCB1c2luZyBGb3JtRGF0YSBiZWZvcmVcbiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gYXJyYXlbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZm9ybURhdGFBcnJheVByb3h5KHRhcmdldCwgbmFtZSwgYXJyYXkpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IHRhcmdldC5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEodmFsdWUgaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICAvLyBTdXBwb3J0IE9iamVjdC5hc3NpZ24gY2FsbCBmcm9tIHByb3h5XG4gICAgICBvd25LZXlzOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSlcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRhcmdldCwgcHJvcCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCksIHByb3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7SHRteEFqYXhFdGN9IFtldGNdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmZpcm1lZF1cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCBjb25maXJtZWQpIHtcbiAgICBsZXQgcmVzb2x2ZSA9IG51bGxcbiAgICBsZXQgcmVqZWN0ID0gbnVsbFxuICAgIGV0YyA9IGV0YyAhPSBudWxsID8gZXRjIDoge31cbiAgICBpZiAoZXRjLnJldHVyblByb21pc2UgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICByZWplY3QgPSBfcmVqZWN0XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIGVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZUhhbmRsZXIgPSBldGMuaGFuZGxlciB8fCBoYW5kbGVBamF4UmVzcG9uc2VcbiAgICBjb25zdCBzZWxlY3QgPSBldGMuc2VsZWN0IHx8IG51bGxcblxuICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAvLyBkbyBub3QgaXNzdWUgcmVxdWVzdHMgZm9yIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV0Yy50YXJnZXRPdmVycmlkZSB8fCBhc0VsZW1lbnQoZ2V0VGFyZ2V0KGVsdCkpXG4gICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IHRhcmdldCA9PSBEVU1NWV9FTFQpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGFyZ2V0RXJyb3InLCB7IHRhcmdldDogZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JykgfSlcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGxldCBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBjb25zdCBzdWJtaXR0ZXIgPSBlbHREYXRhLmxhc3RCdXR0b25DbGlja2VkXG5cbiAgICBpZiAoc3VibWl0dGVyKSB7XG4gICAgICBjb25zdCBidXR0b25QYXRoID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1hY3Rpb24nKVxuICAgICAgaWYgKGJ1dHRvblBhdGggIT0gbnVsbCkge1xuICAgICAgICBwYXRoID0gYnV0dG9uUGF0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25WZXJiID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1tZXRob2QnKVxuICAgICAgaWYgKGJ1dHRvblZlcmIgIT0gbnVsbCkge1xuICAgICAgLy8gaWdub3JlIGJ1dHRvbnMgd2l0aCBmb3JtbWV0aG9kPVwiZGlhbG9nXCJcbiAgICAgICAgaWYgKGJ1dHRvblZlcmIudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyhidXR0b25WZXJiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm1RdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1jb25maXJtJylcbiAgICAvLyBhbGxvdyBldmVudC1iYXNlZCBjb25maXJtYXRpb24gdy8gYSBjYWxsYmFja1xuICAgIGlmIChjb25maXJtZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNzdWVSZXF1ZXN0ID0gZnVuY3Rpb24oc2tpcENvbmZpcm1hdGlvbikge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsICEhc2tpcENvbmZpcm1hdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpcm1EZXRhaWxzID0geyB0YXJnZXQsIGVsdCwgcGF0aCwgdmVyYiwgdHJpZ2dlcmluZ0V2ZW50OiBldmVudCwgZXRjLCBpc3N1ZVJlcXVlc3QsIHF1ZXN0aW9uOiBjb25maXJtUXVlc3Rpb24gfVxuICAgICAgaWYgKHRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpcm0nLCBjb25maXJtRGV0YWlscykgPT09IGZhbHNlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzeW5jRWx0ID0gZWx0XG4gICAgbGV0IHN5bmNTdHJhdGVneSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zeW5jJylcbiAgICBsZXQgcXVldWVTdHJhdGVneSA9IG51bGxcbiAgICBsZXQgYWJvcnRhYmxlID0gZmFsc2VcbiAgICBpZiAoc3luY1N0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBzeW5jU3RyaW5ncyA9IHN5bmNTdHJhdGVneS5zcGxpdCgnOicpXG4gICAgICBjb25zdCBzZWxlY3RvciA9IHN5bmNTdHJpbmdzWzBdLnRyaW0oKVxuICAgICAgaWYgKHNlbGVjdG9yID09PSAndGhpcycpIHtcbiAgICAgICAgc3luY0VsdCA9IGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC1zeW5jJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN5bmNFbHQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHNlbGVjdG9yKSlcbiAgICAgIH1cbiAgICAgIC8vIGRlZmF1bHQgdG8gdGhlIGRyb3Agc3RyYXRlZ3lcbiAgICAgIHN5bmNTdHJhdGVneSA9IChzeW5jU3RyaW5nc1sxXSB8fCAnZHJvcCcpLnRyaW0oKVxuICAgICAgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShzeW5jRWx0KVxuICAgICAgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Ryb3AnICYmIGVsdERhdGEueGhyICYmIGVsdERhdGEuYWJvcnRhYmxlICE9PSB0cnVlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdhYm9ydCcpIHtcbiAgICAgICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhYm9ydGFibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAncmVwbGFjZScpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5LmluZGV4T2YoJ3F1ZXVlJykgPT09IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVTdHJBcnJheSA9IHN5bmNTdHJhdGVneS5zcGxpdCgnICcpXG4gICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAocXVldWVTdHJBcnJheVsxXSB8fCAnbGFzdCcpLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgaWYgKGVsdERhdGEuYWJvcnRhYmxlKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZlbnQpXG4gICAgICAgICAgICBpZiAoZXZlbnREYXRhICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyAmJiBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWUpIHtcbiAgICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9IGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gJ2xhc3QnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID09IG51bGwpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2ZpcnN0JyAmJiBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdsYXN0Jykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXSAvLyBkdW1wIGV4aXN0aW5nIHF1ZXVlXG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGVsdERhdGEueGhyID0geGhyXG4gICAgZWx0RGF0YS5hYm9ydGFibGUgPSBhYm9ydGFibGVcbiAgICBjb25zdCBlbmRSZXF1ZXN0TG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWx0RGF0YS54aHIgPSBudWxsXG4gICAgICBlbHREYXRhLmFib3J0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyAhPSBudWxsICYmXG4gICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVkUmVxdWVzdCA9IGVsdERhdGEucXVldWVkUmVxdWVzdHMuc2hpZnQoKVxuICAgICAgICBxdWV1ZWRSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvbXB0UXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHJvbXB0JylcbiAgICBpZiAocHJvbXB0UXVlc3Rpb24pIHtcbiAgICAgIHZhciBwcm9tcHRSZXNwb25zZSA9IHByb21wdChwcm9tcHRRdWVzdGlvbilcbiAgICAgIC8vIHByb21wdCByZXR1cm5zIG51bGwgaWYgY2FuY2VsbGVkIGFuZCBlbXB0eSBzdHJpbmcgaWYgYWNjZXB0ZWQgd2l0aCBubyBlbnRyeVxuICAgICAgaWYgKHByb21wdFJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgICAhdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cHJvbXB0JywgeyBwcm9tcHQ6IHByb21wdFJlc3BvbnNlLCB0YXJnZXQgfSkpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybVF1ZXN0aW9uICYmICFjb25maXJtZWQpIHtcbiAgICAgIGlmICghY29uZmlybShjb25maXJtUXVlc3Rpb24pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHRSZXNwb25zZSlcblxuICAgIGlmICh2ZXJiICE9PSAnZ2V0JyAmJiAhdXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICB9XG5cbiAgICBpZiAoZXRjLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMgPSBtZXJnZU9iamVjdHMoaGVhZGVycywgZXRjLmhlYWRlcnMpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpXG4gICAgbGV0IGVycm9ycyA9IHJlc3VsdHMuZXJyb3JzXG4gICAgY29uc3QgcmF3Rm9ybURhdGEgPSByZXN1bHRzLmZvcm1EYXRhXG4gICAgaWYgKGV0Yy52YWx1ZXMpIHtcbiAgICAgIG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGZvcm1EYXRhRnJvbU9iamVjdChldGMudmFsdWVzKSlcbiAgICB9XG4gICAgY29uc3QgZXhwcmVzc2lvblZhcnMgPSBmb3JtRGF0YUZyb21PYmplY3QoZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSlcbiAgICBjb25zdCBhbGxGb3JtRGF0YSA9IG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGV4cHJlc3Npb25WYXJzKVxuICAgIGxldCBmaWx0ZXJlZEZvcm1EYXRhID0gZmlsdGVyVmFsdWVzKGFsbEZvcm1EYXRhLCBlbHQpXG5cbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSAmJiB2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgZmlsdGVyZWRGb3JtRGF0YS5zZXQoJ29yZy5odG14LmNhY2hlLWJ1c3RlcicsIGdldFJhd0F0dHJpYnV0ZSh0YXJnZXQsICdpZCcpIHx8ICd0cnVlJylcbiAgICB9XG5cbiAgICAvLyBiZWhhdmlvciBvZiBhbmNob3JzIHcvIGVtcHR5IGhyZWYgaXMgdG8gdXNlIHRoZSBjdXJyZW50IFVSTFxuICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aCA9PT0gJycpIHtcbiAgICAgIHBhdGggPSBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtub0hlYWRlcnNdXG4gICAgICovXG4gICAgY29uc3QgcmVxdWVzdEF0dHJWYWx1ZXMgPSBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXJlcXVlc3QnKVxuXG4gICAgY29uc3QgZWx0SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHVzZVVybFBhcmFtcyA9IGh0bXguY29uZmlnLm1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zLmluZGV4T2YodmVyYikgPj0gMFxuXG4gICAgLyoqIEB0eXBlIEh0bXhSZXF1ZXN0Q29uZmlnICovXG4gICAgY29uc3QgcmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHVzZVVybFBhcmFtcyxcbiAgICAgIGZvcm1EYXRhOiBmaWx0ZXJlZEZvcm1EYXRhLFxuICAgICAgcGFyYW1ldGVyczogZm9ybURhdGFQcm94eShmaWx0ZXJlZEZvcm1EYXRhKSxcbiAgICAgIHVuZmlsdGVyZWRGb3JtRGF0YTogYWxsRm9ybURhdGEsXG4gICAgICB1bmZpbHRlcmVkUGFyYW1ldGVyczogZm9ybURhdGFQcm94eShhbGxGb3JtRGF0YSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdmVyYixcbiAgICAgIGVycm9ycyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogZXRjLmNyZWRlbnRpYWxzIHx8IHJlcXVlc3RBdHRyVmFsdWVzLmNyZWRlbnRpYWxzIHx8IGh0bXguY29uZmlnLndpdGhDcmVkZW50aWFscyxcbiAgICAgIHRpbWVvdXQ6IGV0Yy50aW1lb3V0IHx8IHJlcXVlc3RBdHRyVmFsdWVzLnRpbWVvdXQgfHwgaHRteC5jb25maWcudGltZW91dCxcbiAgICAgIHBhdGgsXG4gICAgICB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50XG4gICAgfVxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maWdSZXF1ZXN0JywgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICAvLyBjb3B5IG91dCBpbiBjYXNlIHRoZSBvYmplY3Qgd2FzIG92ZXJ3cml0dGVuXG4gICAgcGF0aCA9IHJlcXVlc3RDb25maWcucGF0aFxuICAgIHZlcmIgPSByZXF1ZXN0Q29uZmlnLnZlcmJcbiAgICBoZWFkZXJzID0gcmVxdWVzdENvbmZpZy5oZWFkZXJzXG4gICAgZmlsdGVyZWRGb3JtRGF0YSA9IGZvcm1EYXRhRnJvbU9iamVjdChyZXF1ZXN0Q29uZmlnLnBhcmFtZXRlcnMpXG4gICAgZXJyb3JzID0gcmVxdWVzdENvbmZpZy5lcnJvcnNcbiAgICB1c2VVcmxQYXJhbXMgPSByZXF1ZXN0Q29uZmlnLnVzZVVybFBhcmFtc1xuXG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGlvbjpoYWx0ZWQnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0UGF0aCA9IHBhdGguc3BsaXQoJyMnKVxuICAgIGNvbnN0IHBhdGhOb0FuY2hvciA9IHNwbGl0UGF0aFswXVxuICAgIGNvbnN0IGFuY2hvciA9IHNwbGl0UGF0aFsxXVxuXG4gICAgbGV0IGZpbmFsUGF0aCA9IHBhdGhcbiAgICBpZiAodXNlVXJsUGFyYW1zKSB7XG4gICAgICBmaW5hbFBhdGggPSBwYXRoTm9BbmNob3JcbiAgICAgIGNvbnN0IGhhc1ZhbHVlcyA9ICFmaWx0ZXJlZEZvcm1EYXRhLmtleXMoKS5uZXh0KCkuZG9uZVxuICAgICAgaWYgKGhhc1ZhbHVlcykge1xuICAgICAgICBpZiAoZmluYWxQYXRoLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJz8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcmJ1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsUGF0aCArPSB1cmxFbmNvZGUoZmlsdGVyZWRGb3JtRGF0YSlcbiAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnIycgKyBhbmNob3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdmVyaWZ5UGF0aChlbHQsIGZpbmFsUGF0aCwgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6aW52YWxpZFBhdGgnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgeGhyLm9wZW4odmVyYi50b1VwcGVyQ2FzZSgpLCBmaW5hbFBhdGgsIHRydWUpXG4gICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvaHRtbCcpXG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHJlcXVlc3RDb25maWcud2l0aENyZWRlbnRpYWxzXG4gICAgeGhyLnRpbWVvdXQgPSByZXF1ZXN0Q29uZmlnLnRpbWVvdXRcblxuICAgIC8vIHJlcXVlc3QgaGVhZGVyc1xuICAgIGlmIChyZXF1ZXN0QXR0clZhbHVlcy5ub0hlYWRlcnMpIHtcbiAgICAvLyBpZ25vcmUgYWxsIGhlYWRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlcl1cbiAgICAgICAgICBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0h0bXhSZXNwb25zZUluZm99ICovXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvID0ge1xuICAgICAgeGhyLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcmVxdWVzdENvbmZpZyxcbiAgICAgIGV0YyxcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHNlbGVjdCxcbiAgICAgIHBhdGhJbmZvOiB7XG4gICAgICAgIHJlcXVlc3RQYXRoOiBwYXRoLFxuICAgICAgICBmaW5hbFJlcXVlc3RQYXRoOiBmaW5hbFBhdGgsXG4gICAgICAgIHJlc3BvbnNlUGF0aDogbnVsbCxcbiAgICAgICAgYW5jaG9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGllcmFyY2h5ID0gaGllcmFyY2h5Rm9yRWx0KGVsdClcbiAgICAgICAgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aCA9IGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKVxuICAgICAgICByZXNwb25zZUhhbmRsZXIoZWx0LCByZXNwb25zZUluZm8pXG4gICAgICAgIGlmIChyZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgIT09IHRydWUpIHtcbiAgICAgICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAvLyBpZiB0aGUgYm9keSBubyBsb25nZXIgY29udGFpbnMgdGhlIGVsZW1lbnQsIHRyaWdnZXIgdGhlIGV2ZW50IG9uIHRoZSBjbG9zZXN0IHBhcmVudFxuICAgICAgICAvLyByZW1haW5pbmcgaW4gdGhlIERPTVxuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgbGV0IHNlY29uZGFyeVRyaWdnZXJFbHQgPSBudWxsXG4gICAgICAgICAgd2hpbGUgKGhpZXJhcmNoeS5sZW5ndGggPiAwICYmIHNlY29uZGFyeVRyaWdnZXJFbHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50RWx0SW5IaWVyYXJjaHkgPSBoaWVyYXJjaHkuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKGJvZHlDb250YWlucyhwYXJlbnRFbHRJbkhpZXJhcmNoeSkpIHtcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IHBhcmVudEVsdEluSGllcmFyY2h5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWNvbmRhcnlUcmlnZ2VyRWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14Om9uTG9hZEVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgdGhyb3cgZVxuICAgICAgfVxuICAgIH1cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRBYm9ydCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRpbWVvdXQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVJlcXVlc3QnLCByZXNwb25zZUluZm8pKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIHZhciBpbmRpY2F0b3JzID0gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KVxuICAgIHZhciBkaXNhYmxlRWx0cyA9IGRpc2FibGVFbGVtZW50cyhlbHQpXG5cbiAgICBmb3JFYWNoKFsnbG9hZHN0YXJ0JywgJ2xvYWRlbmQnLCAncHJvZ3Jlc3MnLCAnYWJvcnQnXSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBmb3JFYWNoKFt4aHIsIHhoci51cGxvYWRdLCBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnhocjonICsgZXZlbnROYW1lLCB7XG4gICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudC5sZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogZXZlbnQudG90YWxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVNlbmQnLCByZXNwb25zZUluZm8pXG4gICAgY29uc3QgcGFyYW1zID0gdXNlVXJsUGFyYW1zID8gbnVsbCA6IGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkRm9ybURhdGEpXG4gICAgeGhyLnNlbmQocGFyYW1zKVxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlVcGRhdGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3R5cGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFtwYXRoXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICogQHJldHVybiB7SHRteEhpc3RvcnlVcGRhdGV9XG4gICAqL1xuICBmdW5jdGlvbiBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBGaXJzdCBjb25zdWx0IHJlc3BvbnNlIGhlYWRlcnNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IHBhdGhGcm9tSGVhZGVycyA9IG51bGxcbiAgICBsZXQgdHlwZUZyb21IZWFkZXJzID0gbnVsbFxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaC1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVwbGFjZS1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlcGxhY2UtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdyZXBsYWNlJ1xuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIHdhcyBhIHJlc3BvbnNlIGhlYWRlciwgdGhhdCBoYXMgcHJpb3JpdHlcbiAgICBpZiAocGF0aEZyb21IZWFkZXJzKSB7XG4gICAgICBpZiAocGF0aEZyb21IZWFkZXJzID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0eXBlRnJvbUhlYWRlcnMsXG4gICAgICAgICAgcGF0aDogcGF0aEZyb21IZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTmV4dCByZXNvbHZlIHZpYSBET00gdmFsdWVzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmZpbmFsUmVxdWVzdFBhdGhcbiAgICBjb25zdCByZXNwb25zZVBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoXG5cbiAgICBjb25zdCBwdXNoVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXB1c2gtdXJsJylcbiAgICBjb25zdCByZXBsYWNlVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXJlcGxhY2UtdXJsJylcbiAgICBjb25zdCBlbGVtZW50SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHNhdmVUeXBlID0gbnVsbFxuICAgIGxldCBwYXRoID0gbnVsbFxuXG4gICAgaWYgKHB1c2hVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcHVzaFVybFxuICAgIH0gZWxzZSBpZiAocmVwbGFjZVVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncmVwbGFjZSdcbiAgICAgIHBhdGggPSByZXBsYWNlVXJsXG4gICAgfSBlbHNlIGlmIChlbGVtZW50SXNCb29zdGVkKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgIC8vIGZhbHNlIGluZGljYXRlcyBubyBwdXNoLCByZXR1cm4gZW1wdHkgb2JqZWN0XG4gICAgICBpZiAocGF0aCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgLy8gdHJ1ZSBpbmRpY2F0ZXMgd2Ugd2FudCB0byBmb2xsb3cgd2hlcmV2ZXIgdGhlIHNlcnZlciBlbmRlZCB1cCBzZW5kaW5nIHVzXG4gICAgICBpZiAocGF0aCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgICB9XG5cbiAgICAgIC8vIHJlc3RvcmUgYW55IGFuY2hvciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RcbiAgICAgIGlmIChyZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yICYmIHBhdGguaW5kZXhPZignIycpID09PSAtMSkge1xuICAgICAgICBwYXRoID0gcGF0aCArICcjJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogc2F2ZVR5cGUsXG4gICAgICAgIHBhdGhcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9IHJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0NvbmZpZywgc3RhdHVzKSB7XG4gICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVzcG9uc2VIYW5kbGluZ0NvbmZpZy5jb2RlKVxuICAgIHJldHVybiByZWdFeHAudGVzdChzdGF0dXMudG9TdHJpbmcoMTApKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ31cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnICovXG4gICAgICB2YXIgcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQgPSBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nW2ldXG4gICAgICBpZiAoY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQsIHhoci5zdGF0dXMpKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUhhbmRsaW5nRWxlbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBubyBtYXRjaGVzLCByZXR1cm4gbm8gc3dhcFxuICAgIHJldHVybiB7XG4gICAgICBzd2FwOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRpdGxlKHRpdGxlKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBjb25zdCB0aXRsZUVsdCA9IGZpbmQoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsdCkge1xuICAgICAgICB0aXRsZUVsdC5pbm5lckhUTUwgPSB0aXRsZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnRpdGxlID0gdGl0bGVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUFqYXhSZXNwb25zZShlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcbiAgICBsZXQgdGFyZ2V0ID0gcmVzcG9uc2VJbmZvLnRhcmdldFxuICAgIGNvbnN0IGV0YyA9IHJlc3BvbnNlSW5mby5ldGNcbiAgICBjb25zdCByZXNwb25zZUluZm9TZWxlY3QgPSByZXNwb25zZUluZm8uc2VsZWN0XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZU9uTG9hZCcsIHJlc3BvbnNlSW5mbykpIHJldHVyblxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyOi9pKSkge1xuICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyJywgZWx0KVxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtTG9jYXRpb246L2kpKSB7XG4gICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgbGV0IHJlZGlyZWN0UGF0aCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtTG9jYXRpb24nKVxuICAgICAgLyoqIEB0eXBlIHtIdG14QWpheEhlbHBlckNvbnRleHQme3BhdGg6c3RyaW5nfX0gKi9cbiAgICAgIHZhciByZWRpcmVjdFN3YXBTcGVjXG4gICAgICBpZiAocmVkaXJlY3RQYXRoLmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgICByZWRpcmVjdFN3YXBTcGVjID0gcGFyc2VKU09OKHJlZGlyZWN0UGF0aClcbiAgICAgICAgLy8gd2hhdCdzIHRoZSBiZXN0IHdheSB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdXNlciBkaWRuJ3QgaW5jbHVkZSB0aGlzXG4gICAgICAgIHJlZGlyZWN0UGF0aCA9IHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgICBkZWxldGUgcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICB9XG4gICAgICBhamF4SGVscGVyKCdnZXQnLCByZWRpcmVjdFBhdGgsIHJlZGlyZWN0U3dhcFNwZWMpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShyZWRpcmVjdFBhdGgpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUmVmcmVzaCA9IGhhc0hlYWRlcih4aHIsIC9IWC1SZWZyZXNoOi9pKSAmJiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZnJlc2gnKSA9PT0gJ3RydWUnXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlZGlyZWN0Oi9pKSkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24uaHJlZiA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVkaXJlY3QnKVxuICAgICAgc2hvdWxkUmVmcmVzaCAmJiBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlZnJlc2gpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGlzdG9yeVVwZGF0ZSA9IGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKVxuXG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGluZyA9IHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocilcbiAgICBjb25zdCBzaG91bGRTd2FwID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwXG4gICAgbGV0IGlzRXJyb3IgPSAhIXJlc3BvbnNlSGFuZGxpbmcuZXJyb3JcbiAgICBsZXQgaWdub3JlVGl0bGUgPSBodG14LmNvbmZpZy5pZ25vcmVUaXRsZSB8fCByZXNwb25zZUhhbmRsaW5nLmlnbm9yZVRpdGxlXG4gICAgbGV0IHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zZWxlY3RcbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy50YXJnZXQpIHtcbiAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSlcbiAgICB9XG4gICAgdmFyIHN3YXBPdmVycmlkZSA9IGV0Yy5zd2FwT3ZlcnJpZGVcbiAgICBpZiAoc3dhcE92ZXJyaWRlID09IG51bGwgJiYgcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGUpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlXG4gICAgfVxuXG4gICAgLy8gcmVzcG9uc2UgaGVhZGVycyBvdmVycmlkZSByZXNwb25zZSBoYW5kbGluZyBjb25maWdcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgIH1cblxuICAgIHZhciBzZXJ2ZXJSZXNwb25zZSA9IHhoci5yZXNwb25zZVxuICAgIC8qKiBAdHlwZSBIdG14QmVmb3JlU3dhcERldGFpbHMgKi9cbiAgICB2YXIgYmVmb3JlU3dhcERldGFpbHMgPSBtZXJnZU9iamVjdHMoe1xuICAgICAgc2hvdWxkU3dhcCxcbiAgICAgIHNlcnZlclJlc3BvbnNlLFxuICAgICAgaXNFcnJvcixcbiAgICAgIGlnbm9yZVRpdGxlLFxuICAgICAgc2VsZWN0T3ZlcnJpZGVcbiAgICB9LCByZXNwb25zZUluZm8pXG5cbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy5ldmVudCAmJiAhdHJpZ2dlckV2ZW50KHRhcmdldCwgcmVzcG9uc2VIYW5kbGluZy5ldmVudCwgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6YmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgc2VydmVyUmVzcG9uc2UgPSBiZWZvcmVTd2FwRGV0YWlscy5zZXJ2ZXJSZXNwb25zZSAvLyBhbGxvdyB1cGRhdGluZyBjb250ZW50XG4gICAgaXNFcnJvciA9IGJlZm9yZVN3YXBEZXRhaWxzLmlzRXJyb3IgLy8gYWxsb3cgdXBkYXRpbmcgZXJyb3JcbiAgICBpZ25vcmVUaXRsZSA9IGJlZm9yZVN3YXBEZXRhaWxzLmlnbm9yZVRpdGxlIC8vIGFsbG93IHVwZGF0aW5nIGlnbm9yaW5nIHRpdGxlXG4gICAgc2VsZWN0T3ZlcnJpZGUgPSBiZWZvcmVTd2FwRGV0YWlscy5zZWxlY3RPdmVycmlkZSAvLyBhbGxvdyB1cGRhdGluZyBzZWxlY3Qgb3ZlcnJpZGVcblxuICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSB0YXJnZXQgLy8gTWFrZSB1cGRhdGVkIHRhcmdldCBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLmZhaWxlZCA9IGlzRXJyb3IgLy8gTWFrZSBmYWlsZWQgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5zdWNjZXNzZnVsID0gIWlzRXJyb3IgLy8gTWFrZSBzdWNjZXNzZnVsIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcblxuICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjg2KSB7XG4gICAgICAgIGNhbmNlbFBvbGxpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IGV4dGVuc2lvbi50cmFuc2Zvcm1SZXNwb25zZShzZXJ2ZXJSZXNwb25zZSwgeGhyLCBlbHQpXG4gICAgICB9KVxuXG4gICAgICAvLyBTYXZlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSB3aWxsIGJlIGEgaGlzdG9yeSB1cGRhdGVcbiAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICAgIH1cbiAgICAgIHZhciBzd2FwU3BlYyA9IGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcE92ZXJyaWRlKVxuXG4gICAgICBpZiAoIXN3YXBTcGVjLmhhc093blByb3BlcnR5KCdpZ25vcmVUaXRsZScpKSB7XG4gICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gaWdub3JlVGl0bGVcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcblxuICAgICAgLy8gb3B0aW9uYWwgdHJhbnNpdGlvbiBBUEkgcHJvbWlzZSBjYWxsYmFja3NcbiAgICAgIGxldCBzZXR0bGVSZXNvbHZlID0gbnVsbFxuICAgICAgbGV0IHNldHRsZVJlamVjdCA9IG51bGxcblxuICAgICAgaWYgKHJlc3BvbnNlSW5mb1NlbGVjdCkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSW5mb1NlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc2VsZWN0Oi9pKSkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzZWxlY3QnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3RPT0IgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0LW9vYicpXG4gICAgICBjb25zdCBzZWxlY3QgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0JylcblxuICAgICAgbGV0IGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGlmIHdlIG5lZWQgdG8gc2F2ZSBoaXN0b3J5LCBkbyBzbywgYmVmb3JlIHN3YXBwaW5nIHNvIHRoYXQgcmVsYXRpdmUgcmVzb3VyY2VzIGhhdmUgdGhlIGNvcnJlY3QgYmFzZSBVUkxcbiAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5VXBkYXRlJywgbWVyZ2VPYmplY3RzKHsgaGlzdG9yeTogaGlzdG9yeVVwZGF0ZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnB1c2hlZEludG9IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VVcmxJbkhpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpyZXBsYWNlZEluSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dhcCh0YXJnZXQsIHNlcnZlclJlc3BvbnNlLCBzd2FwU3BlYywge1xuICAgICAgICAgICAgc2VsZWN0OiBzZWxlY3RPdmVycmlkZSB8fCBzZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3RPT0IsXG4gICAgICAgICAgICBldmVudEluZm86IHJlc3BvbnNlSW5mbyxcbiAgICAgICAgICAgIGFuY2hvcjogcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvcixcbiAgICAgICAgICAgIGNvbnRleHRFbGVtZW50OiBlbHQsXG4gICAgICAgICAgICBhZnRlclN3YXBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1Td2FwOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1Td2FwJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlclNldHRsZUNhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVNldHRsZTovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlc29sdmUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3dhcEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZWplY3QpXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBzaG91bGRUcmFuc2l0aW9uID0gaHRteC5jb25maWcuZ2xvYmFsVmlld1RyYW5zaXRpb25zXG4gICAgICBpZiAoc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ3RyYW5zaXRpb24nKSkge1xuICAgICAgICBzaG91bGRUcmFuc2l0aW9uID0gc3dhcFNwZWMudHJhbnNpdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVUcmFuc2l0aW9uJywgcmVzcG9uc2VJbmZvKSAmJlxuICAgICAgICAgICAgICB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBjb25zdCBzZXR0bGVQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgICBzZXR0bGVSZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgICBzZXR0bGVSZWplY3QgPSBfcmVqZWN0XG4gICAgICAgIH0pXG4gICAgICAgIC8vIHdyYXAgdGhlIG9yaWdpbmFsIGRvU3dhcCgpIGluIGEgY2FsbCB0byBzdGFydFZpZXdUcmFuc2l0aW9uKClcbiAgICAgICAgY29uc3QgaW5uZXJEb1N3YXAgPSBkb1N3YXBcbiAgICAgICAgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5uZXJEb1N3YXAoKVxuICAgICAgICAgICAgcmV0dXJuIHNldHRsZVByb21pc2VcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzd2FwU3BlYy5zd2FwRGVsYXkgPiAwKSB7XG4gICAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9Td2FwLCBzd2FwU3BlYy5zd2FwRGVsYXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1N3YXAoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNFcnJvcikge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpyZXNwb25zZUVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6ICdSZXNwb25zZSBTdGF0dXMgRXJyb3IgQ29kZSAnICsgeGhyLnN0YXR1cyArICcgZnJvbSAnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlcXVlc3RQYXRoIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXh0ZW5zaW9ucyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIEh0bXhFeHRlbnNpb24+fSAqL1xuICBjb25zdCBleHRlbnNpb25zID0ge31cblxuICAvKipcbiAgICogZXh0ZW5zaW9uQmFzZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYWxsIGV4dGVuc2lvbnMuXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZXh0ZW5zaW9uQmFzZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5pdDogZnVuY3Rpb24oYXBpKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgb25FdmVudDogZnVuY3Rpb24obmFtZSwgZXZ0KSB7IHJldHVybiB0cnVlIH0sXG4gICAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24odGV4dCwgeGhyLCBlbHQpIHsgcmV0dXJuIHRleHQgfSxcbiAgICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgaGFuZGxlU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24oeGhyLCBwYXJhbWV0ZXJzLCBlbHQpIHsgcmV0dXJuIG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZWZpbmVFeHRlbnNpb24gaW5pdGlhbGl6ZXMgdGhlIGV4dGVuc2lvbiBhbmQgYWRkcyBpdCB0byB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNkZWZpbmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbn0gZXh0ZW5zaW9uIHRoZSBleHRlbnNpb24gZGVmaW5pdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gZGVmaW5lRXh0ZW5zaW9uKG5hbWUsIGV4dGVuc2lvbikge1xuICAgIGlmIChleHRlbnNpb24uaW5pdCkge1xuICAgICAgZXh0ZW5zaW9uLmluaXQoaW50ZXJuYWxBUEkpXG4gICAgfVxuICAgIGV4dGVuc2lvbnNbbmFtZV0gPSBtZXJnZU9iamVjdHMoZXh0ZW5zaW9uQmFzZSgpLCBleHRlbnNpb24pXG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlRXh0ZW5zaW9uIHJlbW92ZXMgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFeHRlbnNpb24obmFtZSkge1xuICAgIGRlbGV0ZSBleHRlbnNpb25zW25hbWVdXG4gIH1cblxuICAvKipcbiAgICogZ2V0RXh0ZW5zaW9ucyBzZWFyY2hlcyB1cCB0aGUgRE9NIHRyZWUgdG8gcmV0dXJuIGFsbCBleHRlbnNpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbltdPX0gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nW109fSBleHRlbnNpb25zVG9JZ25vcmVcbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEV4dGVuc2lvbnMoZWx0LCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSkge1xuICAgIGlmIChleHRlbnNpb25zVG9SZXR1cm4gPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9SZXR1cm4gPSBbXVxuICAgIH1cbiAgICBpZiAoZWx0ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbnNUb1JldHVyblxuICAgIH1cbiAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlID0gW11cbiAgICB9XG4gICAgY29uc3QgZXh0ZW5zaW9uc0ZvckVsZW1lbnQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1leHQnKVxuICAgIGlmIChleHRlbnNpb25zRm9yRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChleHRlbnNpb25zRm9yRWxlbWVudC5zcGxpdCgnLCcpLCBmdW5jdGlvbihleHRlbnNpb25OYW1lKSB7XG4gICAgICAgIGV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb25OYW1lLnJlcGxhY2UoLyAvZywgJycpXG4gICAgICAgIGlmIChleHRlbnNpb25OYW1lLnNsaWNlKDAsIDcpID09ICdpZ25vcmU6Jykge1xuICAgICAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZS5wdXNoKGV4dGVuc2lvbk5hbWUuc2xpY2UoNykpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZS5pbmRleE9mKGV4dGVuc2lvbk5hbWUpIDwgMCkge1xuICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uTmFtZV1cbiAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmIGV4dGVuc2lvbnNUb1JldHVybi5pbmRleE9mKGV4dGVuc2lvbikgPCAwKSB7XG4gICAgICAgICAgICBleHRlbnNpb25zVG9SZXR1cm4ucHVzaChleHRlbnNpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEluaXRpYWxpemF0aW9uXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpc1JlYWR5ID0gZmFsc2VcbiAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgaXNSZWFkeSA9IHRydWVcbiAgfSlcblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIG5vdyBpZiBET01Db250ZW50TG9hZGVkIGhhcyBmaXJlZCwgb3RoZXJ3aXNlIGxpc3RlbiBmb3IgaXQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdXNlcyBpc1JlYWR5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGFzayB0aGUgYnJvd3NlciB3aGV0aGVyXG4gICAqIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gZmlyZWQ7IHRoZXJlJ3MgYSBnYXAgYmV0d2VlbiBET01Db250ZW50TG9hZGVkXG4gICAqIGZpcmluZyBhbmQgcmVhZHlzdGF0ZT1jb21wbGV0ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWR5KGZuKSB7XG4gICAgLy8gQ2hlY2tpbmcgcmVhZHlTdGF0ZSBoZXJlIGlzIGEgZmFpbHNhZmUgaW4gY2FzZSB0aGUgaHRteCBzY3JpcHQgdGFnIGVudGVyZWQgdGhlIERPTSBieVxuICAgIC8vIHNvbWUgbWVhbnMgb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQuXG4gICAgaWYgKGlzUmVhZHkgfHwgZ2V0RG9jdW1lbnQoKS5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICBmbigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydEluZGljYXRvclN0eWxlcygpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaW5jbHVkZUluZGljYXRvclN0eWxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG5vbmNlQXR0cmlidXRlID0gaHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZSA/IGAgbm9uY2U9XCIke2h0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2V9XCJgIDogJydcbiAgICAgIGdldERvY3VtZW50KCkuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsXG4gICAgICAgICc8c3R5bGUnICsgbm9uY2VBdHRyaWJ1dGUgKyAnPlxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjB9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJyAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJy4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgPC9zdHlsZT4nKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1ldGFDb25maWcoKSB7XG4gICAgLyoqIEB0eXBlIEhUTUxNZXRhRWxlbWVudCAqL1xuICAgIGNvbnN0IGVsZW1lbnQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImh0bXgtY29uZmlnXCJdJylcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHBhcnNlSlNPTihlbGVtZW50LmNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VNZXRhQ29uZmlnKCkge1xuICAgIGNvbnN0IG1ldGFDb25maWcgPSBnZXRNZXRhQ29uZmlnKClcbiAgICBpZiAobWV0YUNvbmZpZykge1xuICAgICAgaHRteC5jb25maWcgPSBtZXJnZU9iamVjdHMoaHRteC5jb25maWcsIG1ldGFDb25maWcpXG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnRcbiAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgbWVyZ2VNZXRhQ29uZmlnKClcbiAgICBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKVxuICAgIGxldCBib2R5ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgcHJvY2Vzc05vZGUoYm9keSlcbiAgICBjb25zdCByZXN0b3JlZEVsdHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIltoeC10cmlnZ2VyPSdyZXN0b3JlZCddLFtkYXRhLWh4LXRyaWdnZXI9J3Jlc3RvcmVkJ11cIlxuICAgIClcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWJvcnQnLCBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXRcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YSh0YXJnZXQpXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhICYmIGludGVybmFsRGF0YS54aHIpIHtcbiAgICAgICAgaW50ZXJuYWxEYXRhLnhoci5hYm9ydCgpXG4gICAgICB9XG4gICAgfSlcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIGNvbnN0IG9yaWdpbmFsUG9wc3RhdGUgPSB3aW5kb3cub25wb3BzdGF0ZSA/IHdpbmRvdy5vbnBvcHN0YXRlLmJpbmQod2luZG93KSA6IG51bGxcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5zdGF0ZSAmJiBldmVudC5zdGF0ZS5odG14KSB7XG4gICAgICAgIHJlc3RvcmVIaXN0b3J5KClcbiAgICAgICAgZm9yRWFjaChyZXN0b3JlZEVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnJlc3RvcmVkJywge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGdldERvY3VtZW50KCksXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsUG9wc3RhdGUpIHtcbiAgICAgICAgICBvcmlnaW5hbFBvcHN0YXRlKGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoYm9keSwgJ2h0bXg6bG9hZCcsIHt9KSAvLyBnaXZlIHJlYWR5IGhhbmRsZXJzIGEgY2hhbmNlIHRvIGxvYWQgdXAgYmVmb3JlIGZpcmluZyB0aGlzIGV2ZW50XG4gICAgICBib2R5ID0gbnVsbCAvLyBraWxsIHJlZmVyZW5jZSBmb3IgZ2NcbiAgICB9LCAwKVxuICB9KVxuXG4gIHJldHVybiBodG14XG59KSgpXG5cbi8qKiBAdHlwZWRlZiB7J2dldCd8J2hlYWQnfCdwb3N0J3wncHV0J3wnZGVsZXRlJ3wnY29ubmVjdCd8J29wdGlvbnMnfCd0cmFjZSd8J3BhdGNoJ30gSHR0cFZlcmIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2FwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdE9PQl1cbiAqIEBwcm9wZXJ0eSB7Kn0gW2V2ZW50SW5mb11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYW5jaG9yXVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbY29udGV4dEVsZW1lbnRdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU3dhcENhbGxiYWNrXVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclNldHRsZUNhbGxiYWNrXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHN3YXBDYWxsYmFja1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeydpbm5lckhUTUwnIHwgJ291dGVySFRNTCcgfCAnYmVmb3JlYmVnaW4nIHwgJ2FmdGVyYmVnaW4nIHwgJ2JlZm9yZWVuZCcgfCAnYWZ0ZXJlbmQnIHwgJ2RlbGV0ZScgfCAnbm9uZScgfCBzdHJpbmd9IEh0bXhTd2FwU3R5bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEh0bXhTd2FwU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzd2FwRGVsYXlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZXR0bGVEZWxheVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJhbnNpdGlvbl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoZWFkXVxuICogQHByb3BlcnR5IHsndG9wJyB8ICdib3R0b20nfSBbc2Nyb2xsXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JvbGxUYXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3ddXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3dUYXJnZXRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb2N1c1Njcm9sbF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKHRoaXM6Tm9kZSwgZXZ0OkV2ZW50KSA9PiBib29sZWFuKSAmIHtzb3VyY2U6IHN0cmluZ319IENvbmRpdGlvbmFsRnVuY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9sbEludGVydmFsXVxuICogQHByb3BlcnR5IHtDb25kaXRpb25hbEZ1bmN0aW9ufSBbZXZlbnRGaWx0ZXJdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjaGFuZ2VkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbb25jZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnN1bWVdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmcm9tXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Rocm90dGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9vdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyZXNob2xkXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tlbHQ6IEVsZW1lbnQsIG1lc3NhZ2U6IHN0cmluZywgdmFsaWRpdHk6IFZhbGlkaXR5U3RhdGV9fSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gSFgtUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlclxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlci1OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UYXJnZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIWC1DdXJyZW50LVVSTFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtIWC1Qcm9tcHRdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUJvb3N0ZWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0NvbnRlbnQtVHlwZV1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3RdXG4gKi9cblxuLyoqIEB0eXBlZGVmIEh0bXhBamF4SGVscGVyQ29udGV4dFxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3NvdXJjZV1cbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IFtldmVudF1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlVXJsUGFyYW1zXG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHBhcmFtZXRlcnMgZm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IHVuZmlsdGVyZWRGb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHVuZmlsdGVyZWRQYXJhbWV0ZXJzIHVuZmlsdGVyZWRGb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn0gaGVhZGVyc1xuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEBwcm9wZXJ0eSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpdGhDcmVkZW50aWFsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoXG4gKiBAcHJvcGVydHkge0V2ZW50fSB0cmlnZ2VyaW5nRXZlbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUluZm9cbiAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhFdGN9IGV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VsZWN0XG4gKiBAcHJvcGVydHkge3tyZXF1ZXN0UGF0aDogc3RyaW5nLCBmaW5hbFJlcXVlc3RQYXRoOiBzdHJpbmcsIHJlc3BvbnNlUGF0aDogc3RyaW5nfG51bGwsIGFuY2hvcjogc3RyaW5nfX0gcGF0aEluZm9cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N1Y2Nlc3NmdWxdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtrZWVwSW5kaWNhdG9yc11cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhBamF4RXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXR1cm5Qcm9taXNlXVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFt0YXJnZXRPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2RlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBzd2FwXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlcnJvcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtldmVudF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIdG14UmVzcG9uc2VJbmZvICYge3Nob3VsZFN3YXA6IGJvb2xlYW4sIHNlcnZlclJlc3BvbnNlOiBhbnksIGlzRXJyb3I6IGJvb2xlYW4sIGlnbm9yZVRpdGxlOiBib29sZWFuLCBzZWxlY3RPdmVycmlkZTpzdHJpbmd9fSBIdG14QmVmb3JlU3dhcERldGFpbHNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBIdG14QWpheEhhbmRsZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygoKSA9PiB2b2lkKX0gSHRteFNldHRsZVRhc2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhTZXR0bGVJbmZvXG4gKiBAcHJvcGVydHkge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gZWx0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aXRsZV1cbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgtZXh0ZW5zaW9ucy9ibG9iL21haW4vUkVBRE1FLm1kXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14RXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkgeyhhcGk6IGFueSkgPT4gdm9pZH0gaW5pdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnR8Q3VzdG9tRXZlbnQpID0+IGJvb2xlYW59IG9uRXZlbnRcbiAqIEBwcm9wZXJ0eSB7KHRleHQ6IHN0cmluZywgeGhyOiBYTUxIdHRwUmVxdWVzdCwgZWx0OiBFbGVtZW50KSA9PiBzdHJpbmd9IHRyYW5zZm9ybVJlc3BvbnNlXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpID0+IGJvb2xlYW59IGlzSW5saW5lU3dhcFxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLCB0YXJnZXQ6IE5vZGUsIGZyYWdtZW50OiBOb2RlLCBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbykgPT4gYm9vbGVhbnxOb2RlW119IGhhbmRsZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHhocjogWE1MSHR0cFJlcXVlc3QsIHBhcmFtZXRlcnM6IEZvcm1EYXRhLCBlbHQ6IE5vZGUpID0+ICp8c3RyaW5nfG51bGx9IGVuY29kZVBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nW118bnVsbH0gZ2V0U2VsZWN0b3JzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGh0bXhcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBkZXBlbmRzT24ocGF0aFNwZWM6IGFueSwgdXJsOiBzdHJpbmcpIHtcbiAgaWYgKHBhdGhTcGVjID09PSBcImlnbm9yZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGRlcGVuZGVuY3lQYXRoID0gcGF0aFNwZWMuc3BsaXQoXCIvXCIpO1xuICBjb25zdCB1cmxQYXRoID0gdXJsLnNwbGl0KFwiL1wiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeUVsZW1lbnQgPSBkZXBlbmRlbmN5UGF0aC5zaGlmdCgpO1xuICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gdXJsUGF0aFtpXTtcbiAgICBpZiAoZGVwZW5kZW5jeUVsZW1lbnQgIT09IHBhdGhFbGVtZW50ICYmIGRlcGVuZGVuY3lFbGVtZW50ICE9PSBcIipcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDAgfHxcbiAgICAgIChkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDEgJiYgZGVwZW5kZW5jeVBhdGhbMF0gPT09IFwiXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgZWx0c1dpdGhEZXBzID0gaHRteC5maW5kQWxsKFwiW3BhdGgtZGVwc11cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0c1dpdGhEZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZWx0ID0gZWx0c1dpdGhEZXBzW2ldO1xuICAgIGlmIChkZXBlbmRzT24oZWx0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSwgcGF0aCkpIHtcbiAgICAgIGh0bXgudHJpZ2dlcihlbHQsIFwicGF0aC1kZXBzXCIsIG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInBhdGgtZGVwc1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmJlZm9yZU9uTG9hZFwiKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBldnQuZGV0YWlsLnJlcXVlc3RDb25maWc7XG4gICAgICAvLyBtdXRhdGluZyBjYWxsXG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZyAmJlxuICAgICAgICBjb25maWcudmVyYiAhPT0gXCJnZXRcIiAmJlxuICAgICAgICBldnQudGFyZ2V0ICE9IG51bGwgJiZcbiAgICAgICAgZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgZXZ0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIikgIT09IFwiaWdub3JlXCJcbiAgICAgICkge1xuICAgICAgICByZWZyZXNoUGF0aChjb25maWcucGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCwge0h0bXhTZXR0bGVJbmZvLCBIdG14U3dhcFN0eWxlfSBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBldmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJztcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLnJlcGxhY2UoXCJoeC1vbjo6XCIsIFwiaHRteDpcIiksIGV2ZW50LmRldGFpbClcbiAgICAgICAgICAgICAgICAgICAgZS5kaXNwYXRjaEV2ZW50KG5ld0V2ZW50KVxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQuYWRkKGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4oZSBhcyBIVE1MRWxlbWVudCwgbmFtZSwgZXZlbnQsIHRyaWdnZXJlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJ0cmlnZ2VyLWNoaWxkcmVuXCIsIHtcbiAgICBvbkV2ZW50OiAobmFtZSwgZXZ0OiBFdmVudCB8IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKGV2dC5kZXRhaWwubWV0YSA9PT0gJ3RyaWdnZXItY2hpbGRyZW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJpZ2dlcmVkID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8fCBldnQuZGV0YWlsLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdHJpZ2dlckNoaWxkcmVuKHRhcmdldCwgbmFtZSwgZXZ0LCB0cmlnZ2VyZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGk6IGFueSk6IHZvaWQge1xuICAgIH0sXG4gICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uIChcbiAgICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgICB4aHI6IFhNTEh0dHBSZXF1ZXN0LFxuICAgICAgICBlbHQ6IEVsZW1lbnQsXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfSxcbiAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uIChzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgaGFuZGxlU3dhcDogZnVuY3Rpb24gKFxuICAgICAgICBzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsXG4gICAgICAgIHRhcmdldDogTm9kZSxcbiAgICAgICAgZnJhZ21lbnQ6IE5vZGUsXG4gICAgICAgIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvLFxuICAgICk6IGJvb2xlYW4gfCBOb2RlW10ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIHBhcmFtZXRlcnM6IEZvcm1EYXRhLFxuICAgICAgICBlbHQ6IE5vZGUsXG4gICAgKSB7XG4gICAgfSxcbiAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uICgpOiBzdHJpbmdbXSB8IG51bGwge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJkZWJ1Z1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIGlmIChjb25zb2xlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkRFQlVHOlwiLCBuYW1lLCBldnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub29wXG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmNvbnN0IGNvbmZpZzogYW55ID0gaHRteC5jb25maWc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHRteFwiKS5IdG14SW50ZXJuYWxBcGl9ICovXG5sZXQgYXBpOiBhbnk7XG5cbmNvbnN0IGF0dHJQcmVmaXggPSBcImh4LXRhcmdldC1cIjtcblxuLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgc3RyaW5nLnN0YXJ0c1dpdGhcbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXg7XG59XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0gcmVzcENvZGVOdW1iZXJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9XG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BDb2RlVGFyZ2V0KGVsdDogRWxlbWVudCwgcmVzcENvZGVOdW1iZXI6IG51bWJlcikge1xuICBpZiAoIWVsdCB8fCAhcmVzcENvZGVOdW1iZXIpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJlc3BDb2RlID0gcmVzcENvZGVOdW1iZXIudG9TdHJpbmcoKTtcblxuICAvLyAnKicgaXMgdGhlIG9yaWdpbmFsIHN5bnRheCwgYXMgdGhlIG9idmlvdXMgY2hhcmFjdGVyIGZvciBhIHdpbGRjYXJkLlxuICAvLyBUaGUgJ3gnIGFsdGVybmF0aXZlIHdhcyBhZGRlZCBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IHdpdGggSFRNTFxuICAvLyB0ZW1wbGF0aW5nIGVuZ2luZXMsIGR1ZSB0byBhbWJpZ3VpdHkgYXJvdW5kIHdoaWNoIGNoYXJhY3RlcnMgYXJlXG4gIC8vIHN1cHBvcnRlZCBpbiBIVE1MIGF0dHJpYnV0ZXMuXG4gIC8vXG4gIC8vIFN0YXJ0IHdpdGggdGhlIG1vc3Qgc3BlY2lmaWMgcG9zc2libGUgYXR0cmlidXRlIGFuZCBnZW5lcmFsaXplIGZyb21cbiAgLy8gdGhlcmUuXG4gIGNvbnN0IGF0dHJQb3NzaWJpbGl0aWVzID0gW1xuICAgIHJlc3BDb2RlLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCJ4XCIsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInhcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIioqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4eFwiLFxuXG4gICAgXCIqXCIsXG4gICAgXCJ4XCIsXG4gICAgXCIqKipcIixcbiAgICBcInh4eFwiLFxuICBdO1xuICBpZiAoc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI0XCIpIHx8IHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNVwiKSkge1xuICAgIGF0dHJQb3NzaWJpbGl0aWVzLnB1c2goXCJlcnJvclwiKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clBvc3NpYmlsaXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhdHRyID0gYXR0clByZWZpeCArIGF0dHJQb3NzaWJpbGl0aWVzW2ldO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGFwaS5nZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKTtcbiAgICBpZiAoYXR0clZhbHVlKSB7XG4gICAgICBpZiAoYXR0clZhbHVlID09PSBcInRoaXNcIikge1xuICAgICAgICByZXR1cm4gYXBpLmZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFwaS5xdWVyeVNlbGVjdG9yRXh0KGVsdCwgYXR0clZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEBwYXJhbSB7RXZlbnR9IGV2dCAqL1xuZnVuY3Rpb24gaGFuZGxlRXJyb3JGbGFnKGV2dDogQ3VzdG9tRXZlbnQpIHtcbiAgaWYgKGV2dC5kZXRhaWwuaXNFcnJvcikge1xuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvcikge1xuICAgICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvcikge1xuICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IHRydWU7XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJyZXNwb25zZS10YXJnZXRzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBpbml0OiAoYXBpUmVmKSA9PiB7XG4gICAgYXBpID0gYXBpUmVmO1xuXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbmFtZSA9PT0gXCJodG14OmJlZm9yZVN3YXBcIiAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyAhPT0gMjAwXG4gICAgKSB7XG4gICAgICBpZiAoZXZ0LmRldGFpbC50YXJnZXQpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZykge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciAmJlxuICAgICAgICAgIGV2dC5kZXRhaWwueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLm1hdGNoKC9IWC1SZXRhcmdldDovaSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFldnQuZGV0YWlsLnJlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRSZXNwQ29kZVRhcmdldChcbiAgICAgICAgZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnLmVsdCxcbiAgICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzLFxuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgIGV2dC5kZXRhaWwudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJtdXRhdGlvbi1lcnJvclwiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmFmdGVyUmVxdWVzdFwiKSB7XG4gICAgICBpZiAoIWV2dC5kZXRhaWwgfHwgIWV2dC5kZXRhaWwueGhyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXR1cyA9IGV2dC5kZXRhaWwueGhyLnN0YXR1cztcbiAgICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIGh0bXguZmluZEFsbChcIltoeC1vblxcXFw6XFxcXDptdXRhdGlvbi1lcnJvcl1cIikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBcImh0bXg6bXV0YXRpb24tZXJyb3JcIiwgeyBzdGF0dXMgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQge2NyZWF0ZVdlYlNvY2tldENsaWVudH0gZnJvbSBcIi4uL3V0aWwvd3NcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59IiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmNvbnN0IGV2YWxGdW5jUmVnZXggPS9fX2V2YWxfW0EtWmEtejAtOV0rXFwoW2Etel0rXFwpL2dtXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiaHRtZ29cIiwge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgaWYobmFtZSA9PT0gXCJodG14OmJlZm9yZUNsZWFudXBFbGVtZW50XCIgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICB9XG4gICAgfSxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcylcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgIGNvbnN0IG1hdGNoZXMgPSBhdHRyaWJ1dGUudmFsdWUubWF0Y2goZXZhbEZ1bmNSZWdleCkgfHwgW11cbiAgICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBtYXRjaC5yZXBsYWNlKFwiKClcIiwgXCJcIikucmVwbGFjZShcIih0aGlzKVwiLCBcIlwiKS5yZXBsYWNlKFwiO1wiLCBcIlwiKVxuICAgICAgICAgICAgY29uc3QgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgICAgICBpZihlbGUgJiYgZWxlLnRhZ05hbWUgPT09IFwiU0NSSVBUXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwicmVtb3ZpbmcgYXNzb2NpYXRlZCBzY3JpcHQgd2l0aCBpZFwiLCBpZClcbiAgICAgICAgICAgICAgICBlbGUucmVtb3ZlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gJ2h0bXgub3JnJ1xuaW1wb3J0IHtyZW1vdmVBc3NvY2lhdGVkU2NyaXB0c30gZnJvbSBcIi4vaHRtZ29cIjtcblxuXG5cbmludGVyZmFjZSBIdG14SW50ZXJuYWxBcGkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQ6IEVsZW1lbnQpOiBhbnk7XG4gICAgYm9keUNvbnRhaW5zKGVsdDogRWxlbWVudCk6IGJvb2xlYW47XG4gICAgZ2V0QXR0cmlidXRlVmFsdWUoZWx0OiBFbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsO1xuICAgIHRyaWdnZXJFdmVudChlbHQ6IEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZGV0YWlsPzogYW55KTogYm9vbGVhbjtcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQ6IEVsZW1lbnQsIGNhbGxiYWNrOiAoZXh0ZW5zaW9uOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIG1ha2VTZXR0bGVJbmZvKGVsdDogRWxlbWVudCk6IGFueTtcbiAgICBtYWtlRnJhZ21lbnQoaHRtbDogc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudDtcbiAgICBvb2JTd2FwKHN3YXBTdHlsZTogc3RyaW5nLCBmcmFnbWVudDogRWxlbWVudCwgc2V0dGxlSW5mbzogYW55KTogdm9pZDtcbiAgICBzZXR0bGVJbW1lZGlhdGVseSh0YXNrczogYW55KTogdm9pZDtcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0OiBFbGVtZW50LCBjb25kaXRpb246IChub2RlOiBFbGVtZW50KSA9PiBib29sZWFuKTogRWxlbWVudCB8IG51bGw7XG4gICAgZ2V0VHJpZ2dlclNwZWNzKGVsdDogRWxlbWVudCk6IGFueVtdO1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdDogRWxlbWVudCwgdHJpZ2dlclNwZWM6IGFueSwgbm9kZURhdGE6IGFueSwgaGFuZGxlcjogKGVsdDogRWxlbWVudCwgZXZ0OiBFdmVudCkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgZ2V0SGVhZGVycyhlbHQ6IEVsZW1lbnQsIHRhcmdldDogRWxlbWVudCk6IGFueTtcbiAgICBnZXRUYXJnZXQoZWx0OiBFbGVtZW50KTogRWxlbWVudDtcbiAgICBnZXRJbnB1dFZhbHVlcyhlbHQ6IEVsZW1lbnQsIHZlcmI6IHN0cmluZyk6IHsgZXJyb3JzOiBhbnlbXTsgdmFsdWVzOiBhbnkgfTtcbiAgICBnZXRFeHByZXNzaW9uVmFycyhlbHQ6IEVsZW1lbnQpOiBhbnk7XG4gICAgbWVyZ2VPYmplY3RzKG9iajE6IGFueSwgb2JqMjogYW55KTogYW55O1xuICAgIGZpbHRlclZhbHVlcyh2YWx1ZXM6IGFueSwgZWx0OiBFbGVtZW50KTogYW55O1xuICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdD86IEVsZW1lbnQsIG5hbWU/OiBzdHJpbmcsIGRldGFpbD86IGFueSk6IHZvaWQ7XG4gICAgaGFzQXR0cmlidXRlKGVsdDogRWxlbWVudCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgICBzaG91bGRDYW5jZWwoZXZ0OiBFdmVudCwgZWx0OiBFbGVtZW50KTogYm9vbGVhbjtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmludGVyZmFjZSBXZWJTb2NrZXRXcmFwcGVyIHtcbiAgICBzb2NrZXQ6IFdlYlNvY2tldDtcbiAgICBldmVudHMgOiB7IFtrZXk6IHN0cmluZ106ICgoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkKVtdIH07XG4gICAgbWVzc2FnZVF1ZXVlOiB7IG1lc3NhZ2U6IHN0cmluZzsgc2VuZEVsdDogRWxlbWVudCB8IG51bGwgfVtdO1xuICAgIHJldHJ5Q291bnQ6IG51bWJlcjtcbiAgICBzZW5kSW1tZWRpYXRlbHkobWVzc2FnZTogc3RyaW5nLCBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCk6IHZvaWQ7XG4gICAgc2VuZChtZXNzYWdlOiBzdHJpbmcsIHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsKTogdm9pZDtcbiAgICBhZGRFdmVudExpc3RlbmVyKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IChldmVudDogRXZlbnQpID0+IHZvaWQpOiB2b2lkO1xuICAgIGhhbmRsZVF1ZXVlZE1lc3NhZ2VzKCk6IHZvaWQ7XG4gICAgaW5pdCgpOiB2b2lkO1xuICAgIGNsb3NlKCk6IHZvaWQ7XG4gICAgcHVibGljSW50ZXJmYWNlOiB7XG4gICAgICAgIHNlbmQ6IChtZXNzYWdlOiBzdHJpbmcsIHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsKSA9PiB2b2lkO1xuICAgICAgICBzZW5kSW1tZWRpYXRlbHk6IChtZXNzYWdlOiBzdHJpbmcsIHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsKSA9PiB2b2lkO1xuICAgICAgICBxdWV1ZTogeyBtZXNzYWdlOiBzdHJpbmc7IHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsIH1bXTtcbiAgICB9O1xufVxuXG5sZXQgYXBpOiBIdG14SW50ZXJuYWxBcGk7XG5cbmZ1bmN0aW9uIHNwbGl0T25XaGl0ZXNwYWNlKHRyaWdnZXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdHJpZ2dlci50cmltKCkuc3BsaXQoL1xccysvKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGVnYWN5V2Vic29ja2V0VVJMKGVsdDogRWxlbWVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbGVnYWN5U1NFVmFsdWUgPSBhcGkuZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtd3MnKTtcbiAgICBpZiAobGVnYWN5U1NFVmFsdWUpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gc3BsaXRPbldoaXRlc3BhY2UobGVnYWN5U1NFVmFsdWUpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaV0uc3BsaXQoLzooLispLyk7XG4gICAgICAgICAgICBpZiAodmFsdWVbMF0gPT09ICdjb25uZWN0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVXZWJTb2NrZXQoc29ja2V0RWx0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIElmIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIG5vIGxvbmdlciBleGlzdHMsIHRoZW5cbiAgICAvLyBkbyBub3QgY29ubmVjdC9yZWNvbm5lY3QgdGhlIFdlYlNvY2tldC5cbiAgICBpZiAoIWFwaS5ib2R5Q29udGFpbnMoc29ja2V0RWx0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBzb3VyY2Ugc3RyYWlnaHQgZnJvbSB0aGUgZWxlbWVudCdzIHZhbHVlXG4gICAgbGV0IHdzc1NvdXJjZSA9IGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShzb2NrZXRFbHQsICd3cy1jb25uZWN0Jyk7XG5cbiAgICBpZiAod3NzU291cmNlID09IG51bGwgfHwgd3NzU291cmNlID09PSAnJykge1xuICAgICAgICBjb25zdCBsZWdhY3lTb3VyY2UgPSBnZXRMZWdhY3lXZWJzb2NrZXRVUkwoc29ja2V0RWx0KTtcbiAgICAgICAgaWYgKGxlZ2FjeVNvdXJjZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3c3NTb3VyY2UgPSBsZWdhY3lTb3VyY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHdWFyYW50ZWUgdGhhdCB0aGUgd3NzU291cmNlIHZhbHVlIGlzIGEgZnVsbHkgcXVhbGlmaWVkIFVSTFxuICAgIGlmICh3c3NTb3VyY2UuaW5kZXhPZignLycpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IGJhc2VfcGFydCA9IGxvY2F0aW9uLmhvc3RuYW1lICsgKGxvY2F0aW9uLnBvcnQgPyAnOicgKyBsb2NhdGlvbi5wb3J0IDogJycpO1xuICAgICAgICBpZiAobG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgICAgICAgICB3c3NTb3VyY2UgPSAnd3NzOi8vJyArIGJhc2VfcGFydCArIHdzc1NvdXJjZTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHA6Jykge1xuICAgICAgICAgICAgd3NzU291cmNlID0gJ3dzOi8vJyArIGJhc2VfcGFydCArIHdzc1NvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNvY2tldFdyYXBwZXIgPSBjcmVhdGVXZWJzb2NrZXRXcmFwcGVyKHNvY2tldEVsdCwgKCkgPT4gY3JlYXRlV2ViU29ja2V0KHdzc1NvdXJjZSkpO1xuXG4gICAgc29ja2V0V3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChtYXliZUNsb3NlV2ViU29ja2V0U291cmNlKHNvY2tldEVsdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZSA9IChldmVudCBhcyBNZXNzYWdlRXZlbnQpLmRhdGE7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFhcGkudHJpZ2dlckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NCZWZvcmVNZXNzYWdlJywge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIHNvY2tldFdyYXBwZXI6IHNvY2tldFdyYXBwZXIucHVibGljSW50ZXJmYWNlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhcGkud2l0aEV4dGVuc2lvbnMoc29ja2V0RWx0LCAoZXh0ZW5zaW9uKSA9PiB7XG4gICAgICAgICAgICByZXNwb25zZSA9IGV4dGVuc2lvbi50cmFuc2Zvcm1SZXNwb25zZShyZXNwb25zZSwgbnVsbCwgc29ja2V0RWx0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IGFwaS5tYWtlU2V0dGxlSW5mbyhzb2NrZXRFbHQpO1xuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXVxuICAgICAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZHJlbltpXSwgc2V0dGxlSW5mbyk7XG4gICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBodG1nbyBldmFsX18gc2NyaXB0c1xuICAgICAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXBpLnNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpO1xuICAgICAgICBhcGkudHJpZ2dlckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NBZnRlck1lc3NhZ2UnLCB7XG4gICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZSxcbiAgICAgICAgICAgIHNvY2tldFdyYXBwZXI6IHNvY2tldFdyYXBwZXIucHVibGljSW50ZXJmYWNlLFxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFB1dCB0aGUgV2ViU29ja2V0IGludG8gdGhlIEhUTUwgRWxlbWVudCdzIGN1c3RvbSBkYXRhLlxuICAgIGFwaS5nZXRJbnRlcm5hbERhdGEoc29ja2V0RWx0KS53ZWJTb2NrZXQgPSBzb2NrZXRXcmFwcGVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVXZWJzb2NrZXRXcmFwcGVyKHNvY2tldEVsdDogSFRNTEVsZW1lbnQsIHNvY2tldEZ1bmM6ICgpID0+IFdlYlNvY2tldCk6IFdlYlNvY2tldFdyYXBwZXIge1xuICAgIGNvbnN0IHdyYXBwZXI6IFdlYlNvY2tldFdyYXBwZXIgPSB7XG4gICAgICAgIHNvY2tldDogbnVsbCBhcyB1bmtub3duIGFzIFdlYlNvY2tldCxcbiAgICAgICAgbWVzc2FnZVF1ZXVlOiBbXSxcbiAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgZXZlbnRzOiB7fSBhcyB7IFtrZXk6IHN0cmluZ106ICgoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkKVtdIH0sXG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKGV2ZW50OiBFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5ldmVudHNbZXZlbnRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudHNbZXZlbnRdID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZXZlbnRzW2V2ZW50XS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9LFxuICAgICAgICBzZW5kSW1tZWRpYXRlbHkobWVzc2FnZTogc3RyaW5nLCBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXJyb3JFdmVudChzb2NrZXRFbHQsICdodG14OndzRXJyb3InLCB7IGVycm9yOiAnTm8gc29ja2V0IGF2YWlsYWJsZScgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXNlbmRFbHQgfHxcbiAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckV2ZW50KHNlbmRFbHQsICdodG14OndzQmVmb3JlU2VuZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0V3JhcHBlcjogdGhpcy5wdWJsaWNJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbmRFbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFdmVudChzZW5kRWx0LCAnaHRteDp3c0FmdGVyU2VuZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRXcmFwcGVyOiB0aGlzLnB1YmxpY0ludGVyZmFjZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzZW5kKG1lc3NhZ2U6IHN0cmluZywgc2VuZEVsdDogRWxlbWVudCB8IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaCh7IG1lc3NhZ2UsIHNlbmRFbHQgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZEltbWVkaWF0ZWx5KG1lc3NhZ2UsIHNlbmRFbHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBoYW5kbGVRdWV1ZWRNZXNzYWdlcygpIHtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLm1lc3NhZ2VRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVldWVkSXRlbSA9IHRoaXMubWVzc2FnZVF1ZXVlWzBdO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZEltbWVkaWF0ZWx5KHF1ZXVlZEl0ZW0ubWVzc2FnZSwgcXVldWVkSXRlbS5zZW5kRWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuT1BFTikge1xuICAgICAgICAgICAgICAgIC8vIENsb3NlIGRpc2NhcmRlZCBzb2NrZXRcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgV2ViU29ja2V0IGFuZCBldmVudCBoYW5kbGVyc1xuICAgICAgICAgICAgY29uc3Qgc29ja2V0ID0gc29ja2V0RnVuYygpO1xuXG4gICAgICAgICAgICAvLyBUaGUgZXZlbnQudHlwZSBkZXRhaWwgaXMgYWRkZWQgZm9yIGludGVyZmFjZSBjb25mb3JtYW5jZSB3aXRoIHRoZVxuICAgICAgICAgICAgLy8gb3RoZXIgdHdvIGxpZmVjeWNsZSBldmVudHMgKG9wZW4gYW5kIGNsb3NlKSBzbyBhIHNpbmdsZSBoYW5kbGVyIG1ldGhvZFxuICAgICAgICAgICAgLy8gY2FuIGhhbmRsZSB0aGVtIHBvbHltb3JwaGljYWxseSwgaWYgcmVxdWlyZWQuXG4gICAgICAgICAgICBhcGkudHJpZ2dlckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NDb25uZWN0aW5nJywgeyBldmVudDogeyB0eXBlOiAnY29ubmVjdGluZycgfSB9KTtcblxuICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG5cbiAgICAgICAgICAgIHNvY2tldC5vbm9wZW4gPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFdmVudChzb2NrZXRFbHQsICdodG14OndzT3BlbicsIHsgZXZlbnQ6IGUsIHNvY2tldFdyYXBwZXI6IHRoaXMucHVibGljSW50ZXJmYWNlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUXVldWVkTWVzc2FnZXMoKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHNvY2tldC5vbmNsb3NlID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZiBzb2NrZXQgc2hvdWxkIG5vdCBiZSBjb25uZWN0ZWQsIHN0b3AgZnVydGhlciBhdHRlbXB0cyB0byBlc3RhYmxpc2ggY29ubmVjdGlvblxuICAgICAgICAgICAgICAgIC8vIElmIEFibm9ybWFsIENsb3N1cmUvU2VydmljZSBSZXN0YXJ0L1RyeSBBZ2FpbiBMYXRlciwgdGhlbiBzZXQgYSB0aW1lciB0byByZWNvbm5lY3QgYWZ0ZXIgYSBwYXVzZS5cbiAgICAgICAgICAgICAgICBpZiAoIW1heWJlQ2xvc2VXZWJTb2NrZXRTb3VyY2Uoc29ja2V0RWx0KSAmJiBbMTAwNiwgMTAxMiwgMTAxM10uaW5kZXhPZihlLmNvZGUpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsYXkgPSBnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheSh0aGlzLnJldHJ5Q291bnQpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGRlbGF5KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBOb3RpZnkgY2xpZW50IGNvZGUgdGhhdCBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZC4gQ2xpZW50IGNvZGUgY2FuIGluc3BlY3QgYGV2ZW50YCBmaWVsZFxuICAgICAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB3aGV0aGVyIGNsb3N1cmUgaGFzIGJlZW4gdmFsaWQgb3IgYWJub3JtYWxcbiAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NDbG9zZScsIHsgZXZlbnQ6IGUsIHNvY2tldFdyYXBwZXI6IHRoaXMucHVibGljSW50ZXJmYWNlIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgc29ja2V0Lm9uZXJyb3IgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXJyb3JFdmVudChzb2NrZXRFbHQsICdodG14OndzRXJyb3InLCB7IGVycm9yOiBlLCBzb2NrZXRXcmFwcGVyOiB0aGlzIH0pO1xuICAgICAgICAgICAgICAgIG1heWJlQ2xvc2VXZWJTb2NrZXRTb3VyY2Uoc29ja2V0RWx0KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuZXZlbnRzO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZXZlbnRzKS5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnRzW2tdLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoaywgZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2UoKSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICB9LFxuICAgICAgICBwdWJsaWNJbnRlcmZhY2U6IHt9IGFzIGFueSxcbiAgICB9O1xuXG4gICAgd3JhcHBlci5pbml0KCk7XG5cbiAgICB3cmFwcGVyLnB1YmxpY0ludGVyZmFjZSA9IHtcbiAgICAgICAgc2VuZDogd3JhcHBlci5zZW5kLmJpbmQod3JhcHBlciksXG4gICAgICAgIHNlbmRJbW1lZGlhdGVseTogd3JhcHBlci5zZW5kSW1tZWRpYXRlbHkuYmluZCh3cmFwcGVyKSxcbiAgICAgICAgcXVldWU6IHdyYXBwZXIubWVzc2FnZVF1ZXVlLFxuICAgIH07XG5cbiAgICByZXR1cm4gd3JhcHBlcjtcbn1cblxuZnVuY3Rpb24gZW5zdXJlV2ViU29ja2V0U2VuZChlbHQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgbGVnYWN5QXR0cmlidXRlID0gYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXdzJyk7XG4gICAgaWYgKGxlZ2FjeUF0dHJpYnV0ZSAmJiBsZWdhY3lBdHRyaWJ1dGUgIT09ICdzZW5kJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViU29ja2V0UGFyZW50ID0gYXBpLmdldENsb3Nlc3RNYXRjaChlbHQsIChub2RlKSA9PiB7XG4gICAgICAgIHJldHVybiBoYXNXZWJTb2NrZXQobm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgfSk7XG4gICAgaWYgKHdlYlNvY2tldFBhcmVudCkge1xuICAgICAgICBwcm9jZXNzV2ViU29ja2V0U2VuZCh3ZWJTb2NrZXRQYXJlbnQgYXMgSFRNTEVsZW1lbnQsIGVsdCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYXNXZWJTb2NrZXQobm9kZTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXBpLmdldEludGVybmFsRGF0YShub2RlKS53ZWJTb2NrZXQgIT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1dlYlNvY2tldFNlbmQoc29ja2V0RWx0OiBIVE1MRWxlbWVudCwgc2VuZEVsdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGFwaS5nZXRJbnRlcm5hbERhdGEoc2VuZEVsdCk7XG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gYXBpLmdldFRyaWdnZXJTcGVjcyhzZW5kRWx0KTtcbiAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaCgodHMpID0+IHtcbiAgICAgICAgYXBpLmFkZFRyaWdnZXJIYW5kbGVyKHNlbmRFbHQsIHRzLCBub2RlRGF0YSwgKGVsdDogRWxlbWVudCwgZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKG1heWJlQ2xvc2VXZWJTb2NrZXRTb3VyY2Uoc29ja2V0RWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc29ja2V0V3JhcHBlcjogV2ViU29ja2V0V3JhcHBlciA9IGFwaS5nZXRJbnRlcm5hbERhdGEoc29ja2V0RWx0KS53ZWJTb2NrZXQ7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gYXBpLmdldEhlYWRlcnMoc2VuZEVsdCwgYXBpLmdldFRhcmdldChzZW5kRWx0KSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXBpLmdldElucHV0VmFsdWVzKHNlbmRFbHQsICdwb3N0Jyk7XG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSByZXN1bHRzLmVycm9ycztcbiAgICAgICAgICAgIGNvbnN0IHJhd1BhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCByZXN1bHRzLnZhbHVlcyk7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGFwaS5nZXRFeHByZXNzaW9uVmFycyhzZW5kRWx0KTtcbiAgICAgICAgICAgIGNvbnN0IGFsbFBhcmFtZXRlcnMgPSBhcGkubWVyZ2VPYmplY3RzKHJhd1BhcmFtZXRlcnMsIGV4cHJlc3Npb25WYXJzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1ldGVycyA9IGFwaS5maWx0ZXJWYWx1ZXMoYWxsUGFyYW1ldGVycywgc2VuZEVsdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbmRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogZmlsdGVyZWRQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBhbGxQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgZXJyb3JzLFxuXG4gICAgICAgICAgICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldnQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUJvZHk6IHVuZGVmaW5lZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc29ja2V0V3JhcHBlcjogc29ja2V0V3JhcHBlci5wdWJsaWNJbnRlcmZhY2UsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoIWFwaS50cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp3c0NvbmZpZ1NlbmQnLCBzZW5kQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIGVycm9ycyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYm9keSA9IHNlbmRDb25maWcubWVzc2FnZUJvZHk7XG4gICAgICAgICAgICBpZiAoYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9TZW5kID0gT2JqZWN0LmFzc2lnbih7fSwgc2VuZENvbmZpZy5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VuZENvbmZpZy5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvU2VuZC5IRUFERVJTID0gaGVhZGVycztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KHRvU2VuZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNvY2tldFdyYXBwZXIuc2VuZChib2R5LCBlbHQgYXMgRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmIChldnQgJiYgYXBpLnNob3VsZENhbmNlbChldnQsIGVsdCBhcyBFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkocmV0cnlDb3VudDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBleHAgPSBNYXRoLm1pbihyZXRyeUNvdW50LCA2KTtcbiAgICBjb25zdCBtYXhEZWxheSA9IDEwMDAgKiBNYXRoLnBvdygyLCBleHApO1xuICAgIHJldHVybiBtYXhEZWxheSAqIE1hdGgucmFuZG9tKCk7XG59XG5cbmZ1bmN0aW9uIG1heWJlQ2xvc2VXZWJTb2NrZXRTb3VyY2UoZWx0OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghYXBpLmJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgIGFwaS5nZXRJbnRlcm5hbERhdGEoZWx0KS53ZWJTb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlV2ViU29ja2V0KHVybDogc3RyaW5nKTogV2ViU29ja2V0IHtcbiAgICBjb25zdCBzb2NrID0gbmV3IFdlYlNvY2tldCh1cmwsIFtdKTtcbiAgICBzb2NrLmJpbmFyeVR5cGUgPSAoaHRteC5jb25maWcud3NCaW5hcnlUeXBlIHx8ICdibG9iJykgYXMgdW5rbm93biBhcyBCaW5hcnlUeXBlO1xuICAgIHJldHVybiBzb2NrO1xufVxuXG5mdW5jdGlvbiBxdWVyeUF0dHJpYnV0ZU9uVGhpc09yQ2hpbGRyZW4oZWx0OiBIVE1MRWxlbWVudCwgYXR0cmlidXRlTmFtZTogc3RyaW5nKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBIVE1MRWxlbWVudFtdID0gW107XG5cbiAgICAvLyBJZiB0aGUgcGFyZW50IGVsZW1lbnQgYWxzbyBjb250YWlucyB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZSwgdGhlbiBhZGQgaXQgdG8gdGhlIHJlc3VsdHMgdG9vLlxuICAgIGlmIChhcGkuaGFzQXR0cmlidXRlKGVsdCwgYXR0cmlidXRlTmFtZSkgfHwgYXBpLmhhc0F0dHJpYnV0ZShlbHQsICdoeC13cycpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGVsdCk7XG4gICAgfVxuXG4gICAgLy8gU2VhcmNoIGFsbCBjaGlsZCBub2RlcyB0aGF0IG1hdGNoIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlXG4gICAgZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ1snICsgYXR0cmlidXRlTmFtZSArICddLCBbZGF0YS0nICsgYXR0cmlidXRlTmFtZSArICddLCBbZGF0YS1oeC13c10sIFtoeC13c10nKS5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaDxUPihhcnI6IFRbXSwgZnVuYzogKGl0ZW06IFQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoYXJyKSB7XG4gICAgICAgIGFyci5mb3JFYWNoKGZ1bmMpO1xuICAgIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oJ3dzJywge1xuICAgIGluaXQ6IChhcGlSZWY6IEh0bXhJbnRlcm5hbEFwaSkgPT4ge1xuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2UgdG8gaW50ZXJuYWwgQVBJXG4gICAgICAgIGFwaSA9IGFwaVJlZjtcbiAgICB9LFxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IChuYW1lOiBzdHJpbmcsIGV2dDogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgcGFyZW50OiBFbGVtZW50ID0gZXZ0LnRhcmdldCBhcyBFbGVtZW50IHx8IChldnQgYXMgQ3VzdG9tRXZlbnQpLmRldGFpbC5lbHQ7XG5cbiAgICAgICAgaWYoIShwYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gY2xvc2UgdGhlIHNvY2tldCB3aGVuIGVsZW1lbnRzIGFyZSByZW1vdmVkXG4gICAgICAgICAgICBjYXNlICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JzpcbiAgICAgICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhwYXJlbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGFwaS5nZXRJbnRlcm5hbERhdGEocGFyZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxEYXRhLndlYlNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbERhdGEud2ViU29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSB3ZWJzb2NrZXRzIHdoZW4gZWxlbWVudHMgYXJlIHByb2Nlc3NlZFxuICAgICAgICAgICAgY2FzZSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZSc6XG4gICAgICAgICAgICAgICAgZm9yRWFjaChxdWVyeUF0dHJpYnV0ZU9uVGhpc09yQ2hpbGRyZW4ocGFyZW50LCAnd3MtY29ubmVjdCcpLCAoY2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZW5zdXJlV2ViU29ja2V0KGNoaWxkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmb3JFYWNoKHF1ZXJ5QXR0cmlidXRlT25UaGlzT3JDaGlsZHJlbihwYXJlbnQsICd3cy1zZW5kJyksIChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbnN1cmVXZWJTb2NrZXRTZW5kKGNoaWxkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9wYXRoZGVwc1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2RlYnVnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3Jlc3BvbnNlLXRhcmdldHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3JcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbGl2ZXJlbG9hZFwiXG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2h0bWdvXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3dzXCJcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file diff --git a/framework/assets/js/htmxextensions/debug.ts b/framework/assets/js/htmxextensions/debug.ts index 772f86d..a676597 100644 --- a/framework/assets/js/htmxextensions/debug.ts +++ b/framework/assets/js/htmxextensions/debug.ts @@ -3,9 +3,6 @@ import htmx from "htmx.org"; htmx.defineExtension("debug", { // @ts-ignore onEvent: function (name, evt) { - if(name != 'htmx:wsBeforeMessage') { - return - } if (console.debug) { console.debug(name, evt); } else if (console) { diff --git a/framework/assets/js/htmxextensions/ws.ts b/framework/assets/js/htmxextensions/ws.ts index 76dfb6c..3fdbc36 100644 --- a/framework/assets/js/htmxextensions/ws.ts +++ b/framework/assets/js/htmxextensions/ws.ts @@ -2,24 +2,6 @@ import htmx from 'htmx.org' import {removeAssociatedScripts} from "./htmgo"; -declare module 'htmx.org' { - interface Htmx { - defineExtension(name: string, extension: HtmxExtension): void; - createWebSocket?: (url: string) => WebSocket; - config: { - wsReconnectDelay?: 'full-jitter' | ((retryCount: number) => number); - wsBinaryType?: string; - [key: string]: any - }; - [key: string]: any; - } -} - -interface HtmxExtension { - init: (apiRef: HtmxInternalApi) => void; - onEvent: (name: string, evt: Event) => void; - [key: string]: any; -} interface HtmxInternalApi { getInternalData(elt: Element): any; @@ -113,7 +95,7 @@ function ensureWebSocket(socketElt: HTMLElement): void { } } - const socketWrapper = createWebsocketWrapper(socketElt, () => htmx.createWebSocket!(wssSource)); + const socketWrapper = createWebsocketWrapper(socketElt, () => createWebSocket(wssSource)); socketWrapper.addEventListener('message', (event) => { if (maybeCloseWebSocketSource(socketElt)) { @@ -288,7 +270,9 @@ function ensureWebSocketSend(elt: HTMLElement): void { return; } - const webSocketParent = api.getClosestMatch(elt, hasWebSocket); + const webSocketParent = api.getClosestMatch(elt, (node) => { + return hasWebSocket(node as HTMLElement); + }); if (webSocketParent) { processWebSocketSend(webSocketParent as HTMLElement, elt); } @@ -355,16 +339,9 @@ function processWebSocketSend(socketElt: HTMLElement, sendElt: HTMLElement): voi } function getWebSocketReconnectDelay(retryCount: number): number { - const delay = htmx.config.wsReconnectDelay; - if (typeof delay === 'function') { - return delay(retryCount); - } - if (delay === 'full-jitter') { - const exp = Math.min(retryCount, 6); - const maxDelay = 1000 * Math.pow(2, exp); - return maxDelay * Math.random(); - } - return 0; + const exp = Math.min(retryCount, 6); + const maxDelay = 1000 * Math.pow(2, exp); + return maxDelay * Math.random(); } function maybeCloseWebSocketSource(elt: HTMLElement): boolean { @@ -407,18 +384,9 @@ htmx.defineExtension('ws', { init: (apiRef: HtmxInternalApi) => { // Store reference to internal API api = apiRef; - - // Default function for creating new WebSocket objects - if (!htmx.createWebSocket) { - htmx.createWebSocket = createWebSocket; - } - - // Default setting for reconnect delay - if (!htmx.config.wsReconnectDelay) { - htmx.config.wsReconnectDelay = 'full-jitter'; - } }, + // @ts-ignore onEvent: (name: string, evt: Event) => { const parent: Element = evt.target as Element || (evt as CustomEvent).detail.elt; diff --git a/framework/h/attribute.go b/framework/h/attribute.go index 6821288..bdcfef3 100644 --- a/framework/h/attribute.go +++ b/framework/h/attribute.go @@ -141,6 +141,10 @@ func HxExtensions(value ...string) Ren { return Attribute(hx.ExtAttr, strings.Join(value, ",")) } +func JoinExtensions(attrs ...*AttributeR) Ren { + return JoinAttributes(", ", attrs...) +} + func JoinAttributes(sep string, attrs ...*AttributeR) *AttributeR { values := make([]string, 0, len(attrs)) for _, a := range attrs { From ae983473b34cd9c92585655177950f80663e5f4e Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 30 Sep 2024 17:31:09 -0500 Subject: [PATCH 03/28] db progress --- examples/chat/chat/broadcast.go | 96 ++++++++++--- examples/chat/chat/component.go | 12 ++ examples/chat/internal/db/db.go | 31 +++++ examples/chat/internal/db/models.go | 33 +++++ examples/chat/internal/db/provider.go | 25 ++++ examples/chat/internal/db/queries.sql | 44 ++++++ examples/chat/internal/db/queries.sql.go | 170 +++++++++++++++++++++++ examples/chat/internal/db/schema.sql | 31 +++++ examples/chat/main.go | 5 +- examples/chat/sqlc.yaml | 9 ++ examples/chat/ws/manager.go | 58 ++++++-- framework/h/renderer.go | 5 +- 12 files changed, 484 insertions(+), 35 deletions(-) create mode 100644 examples/chat/chat/component.go create mode 100644 examples/chat/internal/db/db.go create mode 100644 examples/chat/internal/db/models.go create mode 100644 examples/chat/internal/db/provider.go create mode 100644 examples/chat/internal/db/queries.sql create mode 100644 examples/chat/internal/db/queries.sql.go create mode 100644 examples/chat/internal/db/schema.sql create mode 100644 examples/chat/sqlc.yaml diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 7ddb247..7e61aff 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -1,40 +1,92 @@ package chat import ( + "chat/internal/db" "chat/ws" + "context" "fmt" + "github.com/google/uuid" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" ) -func StartListener(loader *service.Locator) { - manager := service.Get[ws.SocketManager](loader) +type Manager struct { + socketManager *ws.SocketManager + queries *db.Queries +} - c := make(chan ws.MessageEvent) - manager.Listen(c) +func NewManager(loader *service.Locator) *Manager { + return &Manager{ + socketManager: service.Get[ws.SocketManager](loader), + queries: service.Get[db.Queries](loader), + } +} + +func (m *Manager) StartListener() { + c := make(chan ws.SocketEvent) + m.socketManager.Listen(c) for { select { case event := <-c: - fmt.Printf("Received message from %s: %v\n", event.Id, event.Message) - message := event.Message["message"].(string) - if message == "" { - continue + switch event.Type { + case ws.ConnectedEvent: + fmt.Printf("User %s connected\n", event.Id) + m.backFill(event.Id) + case ws.DisconnectedEvent: + fmt.Printf("User %s disconnected\n", event.Id) + case ws.MessageEvent: + m.onMessage(event.Id, event.Payload) } - - messageEle := h.Div( - h.Attribute("hx-swap-oob", "beforeend"), - h.Class("flex flex-col gap-2 w-full"), - h.Id("messages"), - h.Pf(message), - ) - - manager.BroadcastText( - h.Render( - h.Fragment( - messageEle, - )), - ) } } } + +func (m *Manager) backFill(socketId string) { + messages, _ := m.queries.GetLastMessages(context.Background(), db.GetLastMessagesParams{ + ChatRoomID: "4ccc3f90a27c9375c98477571034b2e1", + Limit: 50, + }) + for _, message := range messages { + m.socketManager.SendText(socketId, + h.Render(MessageRow(message.Message)), + ) + } +} + +func (m *Manager) onMessage(socketId string, payload map[string]any) { + fmt.Printf("Received message from %s: %v\n", socketId, payload) + message := payload["message"].(string) + + if message == "" { + return + } + + ctx := context.Background() + + user, err := m.queries.CreateUser(ctx, uuid.NewString()) + + if err != nil { + fmt.Printf("Error creating user: %v\n", err) + return + } + //chat, _ := m.queries.CreateChatRoom(ctx, "General") + + err = m.queries.InsertMessage( + context.Background(), + db.InsertMessageParams{ + ChatRoomID: "4ccc3f90a27c9375c98477571034b2e1", + UserID: user.ID, + Message: message, + }, + ) + + if err != nil { + fmt.Printf("Error inserting message: %v\n", err) + return + } + + m.socketManager.BroadcastText( + h.Render(MessageRow(message)), + ) +} diff --git a/examples/chat/chat/component.go b/examples/chat/chat/component.go new file mode 100644 index 0000000..2a8c066 --- /dev/null +++ b/examples/chat/chat/component.go @@ -0,0 +1,12 @@ +package chat + +import "github.com/maddalax/htmgo/framework/h" + +func MessageRow(text string) *h.Element { + return h.Div( + h.Attribute("hx-swap-oob", "beforeend"), + h.Class("flex flex-col gap-2 w-full"), + h.Id("messages"), + h.Pf(text), + ) +} diff --git a/examples/chat/internal/db/db.go b/examples/chat/internal/db/db.go new file mode 100644 index 0000000..41b7a34 --- /dev/null +++ b/examples/chat/internal/db/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 + +package db + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/examples/chat/internal/db/models.go b/examples/chat/internal/db/models.go new file mode 100644 index 0000000..71aadfb --- /dev/null +++ b/examples/chat/internal/db/models.go @@ -0,0 +1,33 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 + +package db + +import ( + "database/sql" +) + +type ChatRoom struct { + ID string + Name string + LastMessageSentAt sql.NullString + CreatedAt string + UpdatedAt string +} + +type Message struct { + ID int64 + ChatRoomID string + UserID int64 + Message string + CreatedAt string + UpdatedAt string +} + +type User struct { + ID int64 + Name string + CreatedAt string + UpdatedAt string +} diff --git a/examples/chat/internal/db/provider.go b/examples/chat/internal/db/provider.go new file mode 100644 index 0000000..9078f36 --- /dev/null +++ b/examples/chat/internal/db/provider.go @@ -0,0 +1,25 @@ +package db + +import ( + "context" + "database/sql" + _ "embed" + _ "github.com/mattn/go-sqlite3" +) + +//go:embed schema.sql +var ddl string + +func Provide() *Queries { + db, err := sql.Open("sqlite3", "file:chat.db?cache=shared&_fk=1") + + if err != nil { + panic(err) + } + + if _, err := db.ExecContext(context.Background(), ddl); err != nil { + panic(err) + } + + return New(db) +} diff --git a/examples/chat/internal/db/queries.sql b/examples/chat/internal/db/queries.sql new file mode 100644 index 0000000..597223e --- /dev/null +++ b/examples/chat/internal/db/queries.sql @@ -0,0 +1,44 @@ +-- name: CreateChatRoom :one +INSERT INTO chat_rooms (name, created_at, updated_at) +VALUES (?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +RETURNING id, name, created_at, updated_at, last_message_sent_at; + +-- name: InsertMessage :exec +INSERT INTO messages (chat_room_id, user_id, message, created_at, updated_at) +VALUES (?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +RETURNING id, chat_room_id, user_id, message, created_at, updated_at; + +-- name: UpdateChatRoomLastMessageSentAt :exec +UPDATE chat_rooms +SET last_message_sent_at = CURRENT_TIMESTAMP, updated_at = CURRENT_TIMESTAMP +WHERE id = ?; + +-- name: GetChatRoom :one +SELECT + id, + name, + last_message_sent_at, + created_at, + updated_at +FROM chat_rooms +WHERE chat_rooms.id = ?; + +-- name: CreateUser :one +INSERT INTO users (name, created_at, updated_at) +VALUES (?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +RETURNING id, name, created_at, updated_at; + +-- name: GetLastMessages :many +SELECT + messages.id, + messages.chat_room_id, + messages.user_id, + users.name AS user_name, + messages.message, + messages.created_at, + messages.updated_at +FROM messages + JOIN users ON messages.user_id = users.id +WHERE messages.chat_room_id = ? +ORDER BY messages.created_at +LIMIT ?; diff --git a/examples/chat/internal/db/queries.sql.go b/examples/chat/internal/db/queries.sql.go new file mode 100644 index 0000000..8d7cc09 --- /dev/null +++ b/examples/chat/internal/db/queries.sql.go @@ -0,0 +1,170 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 +// source: queries.sql + +package db + +import ( + "context" + "database/sql" +) + +const createChatRoom = `-- name: CreateChatRoom :one +INSERT INTO chat_rooms (name, created_at, updated_at) +VALUES (?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +RETURNING id, name, created_at, updated_at, last_message_sent_at +` + +type CreateChatRoomRow struct { + ID string + Name string + CreatedAt string + UpdatedAt string + LastMessageSentAt sql.NullString +} + +func (q *Queries) CreateChatRoom(ctx context.Context, name string) (CreateChatRoomRow, error) { + row := q.db.QueryRowContext(ctx, createChatRoom, name) + var i CreateChatRoomRow + err := row.Scan( + &i.ID, + &i.Name, + &i.CreatedAt, + &i.UpdatedAt, + &i.LastMessageSentAt, + ) + return i, err +} + +const createUser = `-- name: CreateUser :one +INSERT INTO users (name, created_at, updated_at) +VALUES (?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +RETURNING id, name, created_at, updated_at +` + +func (q *Queries) CreateUser(ctx context.Context, name string) (User, error) { + row := q.db.QueryRowContext(ctx, createUser, name) + var i User + err := row.Scan( + &i.ID, + &i.Name, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const getChatRoom = `-- name: GetChatRoom :one +SELECT + id, + name, + last_message_sent_at, + created_at, + updated_at +FROM chat_rooms +WHERE chat_rooms.id = ? +` + +func (q *Queries) GetChatRoom(ctx context.Context, id string) (ChatRoom, error) { + row := q.db.QueryRowContext(ctx, getChatRoom, id) + var i ChatRoom + err := row.Scan( + &i.ID, + &i.Name, + &i.LastMessageSentAt, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const getLastMessages = `-- name: GetLastMessages :many +SELECT + messages.id, + messages.chat_room_id, + messages.user_id, + users.name AS user_name, + messages.message, + messages.created_at, + messages.updated_at +FROM messages + JOIN users ON messages.user_id = users.id +WHERE messages.chat_room_id = ? +ORDER BY messages.created_at +LIMIT ? +` + +type GetLastMessagesParams struct { + ChatRoomID string + Limit int64 +} + +type GetLastMessagesRow struct { + ID int64 + ChatRoomID string + UserID int64 + UserName string + Message string + CreatedAt string + UpdatedAt string +} + +func (q *Queries) GetLastMessages(ctx context.Context, arg GetLastMessagesParams) ([]GetLastMessagesRow, error) { + rows, err := q.db.QueryContext(ctx, getLastMessages, arg.ChatRoomID, arg.Limit) + if err != nil { + return nil, err + } + defer rows.Close() + var items []GetLastMessagesRow + for rows.Next() { + var i GetLastMessagesRow + if err := rows.Scan( + &i.ID, + &i.ChatRoomID, + &i.UserID, + &i.UserName, + &i.Message, + &i.CreatedAt, + &i.UpdatedAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const insertMessage = `-- name: InsertMessage :exec +INSERT INTO messages (chat_room_id, user_id, message, created_at, updated_at) +VALUES (?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +RETURNING id, chat_room_id, user_id, message, created_at, updated_at +` + +type InsertMessageParams struct { + ChatRoomID string + UserID int64 + Message string +} + +func (q *Queries) InsertMessage(ctx context.Context, arg InsertMessageParams) error { + _, err := q.db.ExecContext(ctx, insertMessage, arg.ChatRoomID, arg.UserID, arg.Message) + return err +} + +const updateChatRoomLastMessageSentAt = `-- name: UpdateChatRoomLastMessageSentAt :exec +UPDATE chat_rooms +SET last_message_sent_at = CURRENT_TIMESTAMP, updated_at = CURRENT_TIMESTAMP +WHERE id = ? +` + +func (q *Queries) UpdateChatRoomLastMessageSentAt(ctx context.Context, id string) error { + _, err := q.db.ExecContext(ctx, updateChatRoomLastMessageSentAt, id) + return err +} diff --git a/examples/chat/internal/db/schema.sql b/examples/chat/internal/db/schema.sql new file mode 100644 index 0000000..01c0f80 --- /dev/null +++ b/examples/chat/internal/db/schema.sql @@ -0,0 +1,31 @@ +CREATE TABLE IF NOT EXISTS users +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL UNIQUE, + created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP +) STRICT; + +CREATE TABLE IF NOT EXISTS chat_rooms +( + id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))), -- Generates a UUID + name TEXT NOT NULL, + last_message_sent_at TEXT, + created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP +) STRICT; + +CREATE TABLE IF NOT EXISTS messages +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + chat_room_id TEXT NOT NULL, + user_id INTEGER NOT NULL, + message TEXT NOT NULL, + created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (chat_room_id) REFERENCES chat_rooms (id) ON DELETE CASCADE, + FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE +) STRICT; + +CREATE INDEX IF NOT EXISTS idx_messages_chat_room_id ON messages (chat_room_id); +CREATE INDEX IF NOT EXISTS idx_messages_user_id ON messages (user_id); diff --git a/examples/chat/main.go b/examples/chat/main.go index 2b5aed3..dc16ca7 100644 --- a/examples/chat/main.go +++ b/examples/chat/main.go @@ -3,6 +3,7 @@ package main import ( "chat/__htmgo" "chat/chat" + "chat/internal/db" "chat/ws" "embed" "github.com/maddalax/htmgo/framework/h" @@ -17,11 +18,13 @@ var StaticAssets embed.FS func main() { locator := service.NewLocator() + service.Set[db.Queries](locator, service.Singleton, db.Provide) service.Set[ws.SocketManager](locator, service.Singleton, func() *ws.SocketManager { return ws.NewSocketManager() }) - go chat.StartListener(locator) + chatManager := chat.NewManager(locator) + go chatManager.StartListener() h.Start(h.AppOpts{ ServiceLocator: locator, diff --git a/examples/chat/sqlc.yaml b/examples/chat/sqlc.yaml new file mode 100644 index 0000000..30c0518 --- /dev/null +++ b/examples/chat/sqlc.yaml @@ -0,0 +1,9 @@ +version: "2" +sql: + - schema: "internal/db/schema.sql" + queries: "internal/db/queries.sql" + engine: "sqlite" + gen: + go: + package: "db" + out: "internal/db" diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index ae52bd8..1cd60b8 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -7,14 +7,23 @@ import ( "github.com/puzpuzpuz/xsync/v3" ) -type MessageEvent struct { +type EventType string + +const ( + ConnectedEvent EventType = "connected" + DisconnectedEvent EventType = "disconnected" + MessageEvent EventType = "message" +) + +type SocketEvent struct { Id string - Message map[string]any + Type EventType + Payload map[string]any } type SocketManager struct { sockets *xsync.MapOf[string, *websocket.Conn] - listeners []chan MessageEvent + listeners []chan SocketEvent } func NewSocketManager() *SocketManager { @@ -23,29 +32,49 @@ func NewSocketManager() *SocketManager { } } -func (manager *SocketManager) Listen(listener chan MessageEvent) { +func (manager *SocketManager) Listen(listener chan SocketEvent) { if manager.listeners == nil { - manager.listeners = make([]chan MessageEvent, 0) + manager.listeners = make([]chan SocketEvent, 0) } manager.listeners = append(manager.listeners, listener) } -func (manager *SocketManager) OnMessage(id string, message map[string]any) { +func (manager *SocketManager) dispatch(event SocketEvent) { for _, listener := range manager.listeners { - listener <- MessageEvent{ - Id: id, - Message: message, - } + listener <- event } } +func (manager *SocketManager) OnMessage(id string, message map[string]any) { + manager.dispatch(SocketEvent{ + Id: id, + Type: MessageEvent, + Payload: message, + }) +} + func (manager *SocketManager) Add(id string, conn *websocket.Conn) { manager.sockets.Store(id, conn) + manager.dispatch(SocketEvent{ + Id: id, + Type: ConnectedEvent, + Payload: map[string]any{}, + }) +} + +func (manager *SocketManager) OnClose(id string) { + manager.dispatch(SocketEvent{ + Id: id, + Type: DisconnectedEvent, + Payload: map[string]any{}, + }) + manager.sockets.Delete(id) } func (manager *SocketManager) CloseWithError(id string, message string) { conn := manager.Get(id) if conn != nil { + defer manager.OnClose(id) conn.Close(websocket.StatusInternalError, message) } } @@ -53,9 +82,9 @@ func (manager *SocketManager) CloseWithError(id string, message string) { func (manager *SocketManager) Disconnect(id string) { conn := manager.Get(id) if conn != nil { + defer manager.OnClose(id) _ = conn.CloseNow() } - manager.sockets.Delete(id) } func (manager *SocketManager) Get(id string) *websocket.Conn { @@ -78,3 +107,10 @@ func (manager *SocketManager) BroadcastText(message string) { fmt.Printf("Broadcasting message: \n%s\n", message) manager.Broadcast([]byte(message), websocket.MessageText) } + +func (manager *SocketManager) SendText(id string, message string) { + conn := manager.Get(id) + if conn != nil { + _ = conn.Write(context.Background(), websocket.MessageText, []byte(message)) + } +} diff --git a/framework/h/renderer.go b/framework/h/renderer.go index e31240f..f0fd913 100644 --- a/framework/h/renderer.go +++ b/framework/h/renderer.go @@ -51,7 +51,9 @@ func (ctx *RenderContext) AddScript(funcName string, body string) { } func (node *Element) Render(context *RenderContext) { - // some elements may not have a tag, such as a Fragment + if node == nil { + return + } if node.tag == CachedNodeTag { meta := node.meta.(*CachedNode) @@ -65,6 +67,7 @@ func (node *Element) Render(context *RenderContext) { return } + // some elements may not have a tag, such as a Fragment if node.tag != "" { context.builder.WriteString("<") context.builder.WriteString(node.tag) From 787ccb4fc1c23f74cf9ec6369c4da79eb05aadf8 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 30 Sep 2024 20:32:42 -0500 Subject: [PATCH 04/28] entry page --- cli/htmgo/tasks/astgen/entry.go | 11 +++ examples/chat/chat/service.go | 25 ++++++ examples/chat/components/button.go | 41 ++++++++++ examples/chat/components/error.go | 11 +++ examples/chat/components/input.go | 54 +++++++++++++ examples/chat/pages/chat.$id.go | 91 +++++++++++++++++++++ examples/chat/pages/index.go | 122 +++++++++++------------------ examples/chat/partials/index.go | 62 +++++---------- framework-ui/ui/input.go | 9 ++- framework/h/base.go | 5 ++ framework/h/swap.go | 2 +- 11 files changed, 313 insertions(+), 120 deletions(-) create mode 100644 examples/chat/chat/service.go create mode 100644 examples/chat/components/button.go create mode 100644 examples/chat/components/error.go create mode 100644 examples/chat/components/input.go create mode 100644 examples/chat/pages/chat.$id.go diff --git a/cli/htmgo/tasks/astgen/entry.go b/cli/htmgo/tasks/astgen/entry.go index d14cb34..7b4d13b 100644 --- a/cli/htmgo/tasks/astgen/entry.go +++ b/cli/htmgo/tasks/astgen/entry.go @@ -293,6 +293,17 @@ func formatRoute(path string) string { path = strings.ReplaceAll(path, "_", "/") path = strings.ReplaceAll(path, ".", "/") path = strings.ReplaceAll(path, "\\", "/") + + parts := strings.Split(path, "/") + + for i, part := range parts { + if strings.HasPrefix(part, ":") { + parts[i] = fmt.Sprintf("{%s}", part[1:]) + } + } + + path = strings.Join(parts, "/") + if path == "" { return "/" } diff --git a/examples/chat/chat/service.go b/examples/chat/chat/service.go new file mode 100644 index 0000000..465b2ec --- /dev/null +++ b/examples/chat/chat/service.go @@ -0,0 +1,25 @@ +package chat + +import ( + "chat/internal/db" + "context" + "github.com/maddalax/htmgo/framework/service" +) + +type Service struct { + queries *db.Queries +} + +func NewService(locator *service.Locator) *Service { + return &Service{ + queries: service.Get[db.Queries](locator), + } +} + +func (s *Service) GetRoom(id string) (*db.ChatRoom, error) { + room, err := s.queries.GetChatRoom(context.Background(), id) + if err != nil { + return nil, err + } + return &room, nil +} diff --git a/examples/chat/components/button.go b/examples/chat/components/button.go new file mode 100644 index 0000000..bc767c8 --- /dev/null +++ b/examples/chat/components/button.go @@ -0,0 +1,41 @@ +package components + +import "github.com/maddalax/htmgo/framework/h" + +type ButtonProps struct { + Id string + Text string + Target string + Type string + Trigger string + Get string + Class string + Children []h.Ren +} + +func PrimaryButton(props ButtonProps) h.Ren { + props.Class = h.MergeClasses(props.Class, "border-slate-800 bg-slate-900 hover:bg-slate-800 text-white") + return Button(props) +} + +func SecondaryButton(props ButtonProps) h.Ren { + props.Class = h.MergeClasses(props.Class, "border-gray-700 bg-gray-700 text-white") + return Button(props) +} + +func Button(props ButtonProps) h.Ren { + + text := h.Text(props.Text) + + button := h.Button( + h.If(props.Id != "", h.Id(props.Id)), + h.If(props.Children != nil, h.Children(props.Children...)), + h.Class("flex gap-1 items-center justify-center border p-4 rounded cursor-hover", props.Class), + h.If(props.Get != "", h.Get(props.Get)), + h.If(props.Target != "", h.HxTarget(props.Target)), + h.IfElse(props.Type != "", h.Type(props.Type), h.Type("button")), + text, + ) + + return button +} diff --git a/examples/chat/components/error.go b/examples/chat/components/error.go new file mode 100644 index 0000000..a20ba0d --- /dev/null +++ b/examples/chat/components/error.go @@ -0,0 +1,11 @@ +package components + +import "github.com/maddalax/htmgo/framework/h" + +func FormError(error string) *h.Element { + return h.Div( + h.Id("form-error"), + h.Text(error), + h.If(error != "", h.Class("p-4 bg-rose-400 text-white rounded")), + ) +} diff --git a/examples/chat/components/input.go b/examples/chat/components/input.go new file mode 100644 index 0000000..eadad94 --- /dev/null +++ b/examples/chat/components/input.go @@ -0,0 +1,54 @@ +package components + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/hx" +) + +type InputProps struct { + Id string + Label string + Name string + Type string + DefaultValue string + Placeholder string + Required bool + ValidationPath string + Error string + Children []h.Ren +} + +func Input(props InputProps) *h.Element { + validation := h.If(props.ValidationPath != "", h.Children( + h.Post(props.ValidationPath, hx.BlurEvent), + h.Attribute("hx-swap", "innerHTML transition:true"), + h.Attribute("hx-target", "next div"), + )) + + if props.Type == "" { + props.Type = "text" + } + + input := h.Input( + props.Type, + h.Class("border p-2 rounded focus:outline-none focus:ring focus:ring-slate-800"), + h.If(props.Name != "", h.Name(props.Name)), + h.If(props.Children != nil, h.Children(props.Children...)), + h.If(props.Required, h.Required()), + h.If(props.DefaultValue != "", h.Attribute("value", props.DefaultValue)), + validation, + ) + + wrapped := h.Div( + h.If(props.Id != "", h.Id(props.Id)), + h.Class("flex flex-col gap-1"), + h.If(props.Label != "", h.Label(h.Text(props.Label))), + input, + h.Div( + h.Id(props.Id+"-error"), + h.Class("text-red-500"), + ), + ) + + return wrapped +} diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go new file mode 100644 index 0000000..f695264 --- /dev/null +++ b/examples/chat/pages/chat.$id.go @@ -0,0 +1,91 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/hx" + "github.com/maddalax/htmgo/framework/js" +) + +func ChatRoom(ctx *h.RequestContext) *h.Page { + return h.NewPage( + RootPage( + h.Div( + h.JoinExtensions( + h.TriggerChildren(), + h.HxExtension("ws"), + ), + h.Attribute("ws-connect", "/chat"), + h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), + Form(ctx), + h.Div( + h.Div( + h.Id("messages"), + h.Class("flex flex-col gap-2 w-full"), + ), + ), + ), + ), + ) +} + +func MessageInput() *h.Element { + return h.Input("text", + h.Id("message-input"), + h.Required(), + h.Class("p-4 rounded-md border border-slate-200"), + h.Name("message"), + h.Placeholder("Message"), + h.HxBeforeWsSend( + js.SetValue(""), + ), + h.OnEvent(hx.KeyDownEvent, js.SubmitFormOnEnter()), + ) +} + +func Form(ctx *h.RequestContext) *h.Element { + return h.Div( + h.Class("flex flex-col items-center justify-center p-4 gap-6"), + h.H2F("Form submission with ws example", h.Class("text-2xl font-bold")), + h.Form( + h.Attribute("ws-send", ""), + h.Class("flex flex-col gap-2"), + h.LabelFor("name", "Your Message"), + MessageInput(), + SubmitButton(), + ), + ) +} + +func SubmitButton() *h.Element { + buttonClasses := "rounded items-center px-3 py-2 bg-slate-800 text-white w-full text-center" + return h.Div( + h.HxBeforeRequest( + js.RemoveClassOnChildren(".loading", "hidden"), + js.SetClassOnChildren(".submit", "hidden"), + ), + h.HxAfterRequest( + js.SetClassOnChildren(".loading", "hidden"), + js.RemoveClassOnChildren(".submit", "hidden"), + ), + h.Class("flex gap-2 justify-center"), + h.Button( + h.Class("loading hidden relative text-center", buttonClasses), + Spinner(), + h.Disabled(), + h.Text("Submitting..."), + ), + h.Button( + h.Type("submit"), + h.Class("submit", buttonClasses), + h.Text("Submit"), + ), + ) +} + +func Spinner(children ...h.Ren) *h.Element { + return h.Div( + h.Children(children...), + h.Class("absolute left-1 spinner spinner-border animate-spin inline-block w-6 h-6 border-4 rounded-full border-slate-200 border-t-transparent"), + h.Attribute("role", "status"), + ) +} diff --git a/examples/chat/pages/index.go b/examples/chat/pages/index.go index 59b4628..c077f08 100644 --- a/examples/chat/pages/index.go +++ b/examples/chat/pages/index.go @@ -1,91 +1,63 @@ package pages import ( + "chat/components" + "chat/partials" "github.com/maddalax/htmgo/framework/h" - "github.com/maddalax/htmgo/framework/hx" - "github.com/maddalax/htmgo/framework/js" ) -func IndexPage(ctx *h.RequestContext) *h.Page { +func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { return h.NewPage( RootPage( h.Div( - h.JoinExtensions( - h.TriggerChildren(), - h.HxExtension("ws"), - ), - h.Attribute("ws-connect", "/chat"), - h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), - Form(ctx), + h.Class("flex flex-col items-center justify-center min-h-screen bg-neutral-100"), h.Div( - h.Div( - h.Id("messages"), - h.Class("flex flex-col gap-2 w-full"), + h.Class("bg-white p-8 rounded-lg shadow-lg w-full max-w-md"), + h.H2F("htmgo chat", h.Class("text-3xl font-bold text-center mb-6")), + h.Form( + h.Attribute("hx-swap", "none"), + h.PostPartial(partials.CreateOrJoinRoom), + h.Class("flex flex-col gap-3"), + + components.Input(components.InputProps{ + Id: "username", + Name: "username", + Label: "Username", + Required: true, + }), + + h.Div( + h.Class("mt-6 flex flex-col gap-3"), + + components.Input(components.InputProps{ + Name: "new-chat-room", + Label: "Create a New Chat Room", + Placeholder: "Chat Room Name", + }), + + h.Div( + h.Class("flex items-center justify-center gap-4"), + h.Div(h.Class("border-t border-gray-300 flex-grow")), + h.P(h.Text("OR"), h.Class("text-gray-500")), + h.Div(h.Class("border-t border-gray-300 flex-grow")), + ), + + components.Input(components.InputProps{ + Id: "join-chat-room", + Name: "join-chat-room", + Label: "Join a Chat Room", + Placeholder: "Chat Room Id", + }), + ), + + components.FormError(""), + components.PrimaryButton(components.ButtonProps{ + Type: "submit", + Text: "Submit", + }), ), ), ), ), ) } - -func MessageInput() *h.Element { - return h.Input("text", - h.Id("message-input"), - h.Required(), - h.Class("p-4 rounded-md border border-slate-200"), - h.Name("message"), - h.Placeholder("Message"), - h.HxBeforeWsSend( - js.SetValue(""), - ), - h.OnEvent(hx.KeyDownEvent, js.SubmitFormOnEnter()), - ) -} - -func Form(ctx *h.RequestContext) *h.Element { - return h.Div( - h.Class("flex flex-col items-center justify-center p-4 gap-6"), - h.H2F("Form submission with ws example", h.Class("text-2xl font-bold")), - h.Form( - h.Attribute("ws-send", ""), - h.Class("flex flex-col gap-2"), - h.LabelFor("name", "Your Message"), - MessageInput(), - SubmitButton(), - ), - ) -} - -func SubmitButton() *h.Element { - buttonClasses := "rounded items-center px-3 py-2 bg-slate-800 text-white w-full text-center" - return h.Div( - h.HxBeforeRequest( - js.RemoveClassOnChildren(".loading", "hidden"), - js.SetClassOnChildren(".submit", "hidden"), - ), - h.HxAfterRequest( - js.SetClassOnChildren(".loading", "hidden"), - js.RemoveClassOnChildren(".submit", "hidden"), - ), - h.Class("flex gap-2 justify-center"), - h.Button( - h.Class("loading hidden relative text-center", buttonClasses), - Spinner(), - h.Disabled(), - h.Text("Submitting..."), - ), - h.Button( - h.Type("submit"), - h.Class("submit", buttonClasses), - h.Text("Submit"), - ), - ) -} - -func Spinner(children ...h.Ren) *h.Element { - return h.Div( - h.Children(children...), - h.Class("absolute left-1 spinner spinner-border animate-spin inline-block w-6 h-6 border-4 rounded-full border-slate-200 border-t-transparent"), - h.Attribute("role", "status"), - ) -} diff --git a/examples/chat/partials/index.go b/examples/chat/partials/index.go index f5b47e8..d9b3c98 100644 --- a/examples/chat/partials/index.go +++ b/examples/chat/partials/index.go @@ -1,54 +1,30 @@ package partials import ( + "chat/chat" + "chat/components" "github.com/maddalax/htmgo/framework/h" - "strconv" ) -func CounterPartial(ctx *h.RequestContext) *h.Partial { - count, err := strconv.ParseInt(ctx.FormValue("count"), 10, 64) +func CreateOrJoinRoom(ctx *h.RequestContext) *h.Partial { + locator := ctx.ServiceLocator() + service := chat.NewService(locator) - if err != nil { - count = 0 + chatRoomId := ctx.FormValue("join-chat-room") + + if chatRoomId != "" { + room, _ := service.GetRoom(chatRoomId) + if room == nil { + return h.SwapPartial(ctx, components.FormError("Room not found")) + } else { + return h.RedirectPartial("/chat/" + chatRoomId) + } } - count++ + chatRoomName := ctx.FormValue("chat-room-name") + if chatRoomName != "" { + // create room + } - return h.SwapManyPartial( - ctx, - CounterForm(int(count)), - h.ElementIf(count > 10, SubmitButton("New record!")), - ) -} - -func CounterForm(count int) *h.Element { - return h.Form( - h.Class("flex flex-col gap-3 items-center"), - h.Id("counter-form"), - h.PostPartial(CounterPartial), - h.Input("text", - h.Class("hidden"), - h.Value(count), - h.Name("count"), - ), - h.P( - h.AttributePairs( - "id", "counter", - "class", "text-xl", - "name", "count", - "text", "count", - ), - h.TextF("Count: %d", count), - ), - SubmitButton("Increment"), - ) -} - -func SubmitButton(text string) *h.Element { - return h.Button( - h.Class("bg-rose-400 hover:bg-rose-500 text-white font-bold py-2 px-4 rounded"), - h.Id("swap-text"), - h.Type("submit"), - h.Text(text), - ) + return h.SwapPartial(ctx, components.FormError("Create a new room or join an existing one")) } diff --git a/framework-ui/ui/input.go b/framework-ui/ui/input.go index 585fc3d..151e457 100644 --- a/framework-ui/ui/input.go +++ b/framework-ui/ui/input.go @@ -11,6 +11,8 @@ type InputProps struct { Name string Type string DefaultValue string + Placeholder string + Required bool ValidationPath string Children []h.Ren } @@ -22,19 +24,24 @@ func Input(props InputProps) h.Ren { h.Attribute("hx-target", "next div"), )) + if props.Type == "" { + props.Type = "text" + } + input := h.Input( props.Type, h.Class("border p-2 rounded"), h.If(props.Id != "", h.Id(props.Id)), h.If(props.Name != "", h.Name(props.Name)), h.If(props.Children != nil, h.Children(props.Children...)), + h.If(props.Required, h.Required()), h.If(props.DefaultValue != "", h.Attribute("value", props.DefaultValue)), validation, ) wrapped := h.Div( h.Class("flex flex-col gap-1"), - h.If(props.Label != "", h.Label(props.Label)), + h.If(props.Label != "", h.Label(h.Text(props.Label))), input, h.Div(h.Class("text-red-500")), ) diff --git a/framework/h/base.go b/framework/h/base.go index 01ecd76..9301ef8 100644 --- a/framework/h/base.go +++ b/framework/h/base.go @@ -1,6 +1,7 @@ package h import ( + "github.com/maddalax/htmgo/framework/hx" "html" "net/http" "reflect" @@ -56,6 +57,10 @@ func SwapPartial(ctx *RequestContext, swap *Element) *Partial { SwapMany(ctx, swap)) } +func RedirectPartial(url string) *Partial { + return NewPartialWithHeaders(NewHeaders(hx.RedirectHeader, url), Fragment()) +} + func SwapManyPartial(ctx *RequestContext, swaps ...*Element) *Partial { return NewPartial( SwapMany(ctx, swaps...), diff --git a/framework/h/swap.go b/framework/h/swap.go index b43a2af..127d05b 100644 --- a/framework/h/swap.go +++ b/framework/h/swap.go @@ -65,7 +65,7 @@ func SwapMany(ctx *RequestContext, elements ...*Element) *Element { for _, element := range elements { element.AppendChild(outOfBandSwap("")) } - return Template(Map(elements, func(arg *Element) Ren { + return Fragment(Map(elements, func(arg *Element) Ren { return arg })...) } From 27b5de93ea1c89f53c6bc9567b83b95d3d35d497 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 30 Sep 2024 22:08:52 -0500 Subject: [PATCH 05/28] chat working --- examples/chat/chat/broadcast.go | 67 ++++++++++--------- examples/chat/chat/component.go | 14 +++- examples/chat/chat/service.go | 59 +++++++++++++++++ examples/chat/internal/db/models.go | 2 + examples/chat/internal/db/queries.sql | 19 +++--- examples/chat/internal/db/queries.sql.go | 70 ++++++++++++++++---- examples/chat/internal/db/schema.sql | 6 +- examples/chat/main.go | 2 +- examples/chat/pages/chat.$id.go | 83 +++++++++++++----------- examples/chat/partials/index.go | 41 ++++++++++-- examples/chat/ws/handler.go | 34 ++++++++-- examples/chat/ws/manager.go | 49 ++++++++++---- framework/h/app.go | 10 +-- framework/h/base.go | 5 -- framework/h/header.go | 2 +- framework/h/qs.go | 2 +- 16 files changed, 331 insertions(+), 134 deletions(-) diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 7e61aff..3042704 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -5,20 +5,22 @@ import ( "chat/ws" "context" "fmt" - "github.com/google/uuid" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" + "time" ) type Manager struct { socketManager *ws.SocketManager queries *db.Queries + service *Service } -func NewManager(loader *service.Locator) *Manager { +func NewManager(locator *service.Locator) *Manager { return &Manager{ - socketManager: service.Get[ws.SocketManager](loader), - queries: service.Get[db.Queries](loader), + socketManager: service.Get[ws.SocketManager](locator), + queries: service.Get[db.Queries](locator), + service: NewService(locator), } } @@ -32,61 +34,58 @@ func (m *Manager) StartListener() { switch event.Type { case ws.ConnectedEvent: fmt.Printf("User %s connected\n", event.Id) - m.backFill(event.Id) + m.backFill(event.Id, event.RoomId) case ws.DisconnectedEvent: fmt.Printf("User %s disconnected\n", event.Id) case ws.MessageEvent: - m.onMessage(event.Id, event.Payload) + m.onMessage(event) } } } } -func (m *Manager) backFill(socketId string) { +func (m *Manager) backFill(socketId string, roomId string) { messages, _ := m.queries.GetLastMessages(context.Background(), db.GetLastMessagesParams{ - ChatRoomID: "4ccc3f90a27c9375c98477571034b2e1", - Limit: 50, + ChatRoomID: roomId, + Limit: 200, }) for _, message := range messages { + parsed, _ := time.Parse("2006-01-02 15:04:05", message.CreatedAt) m.socketManager.SendText(socketId, - h.Render(MessageRow(message.Message)), + h.Render(MessageRow(&Message{ + UserId: message.UserID, + UserName: message.UserName, + Message: message.Message, + CreatedAt: parsed, + })), ) } } -func (m *Manager) onMessage(socketId string, payload map[string]any) { - fmt.Printf("Received message from %s: %v\n", socketId, payload) - message := payload["message"].(string) +func (m *Manager) onMessage(e ws.SocketEvent) { + fmt.Printf("Received message from %s: %v\n", e.Id, e.Payload) + message := e.Payload["message"].(string) if message == "" { return } - ctx := context.Background() - - user, err := m.queries.CreateUser(ctx, uuid.NewString()) + user, err := m.queries.GetUserBySessionId(context.Background(), e.Id) if err != nil { - fmt.Printf("Error creating user: %v\n", err) - return - } - //chat, _ := m.queries.CreateChatRoom(ctx, "General") - - err = m.queries.InsertMessage( - context.Background(), - db.InsertMessageParams{ - ChatRoomID: "4ccc3f90a27c9375c98477571034b2e1", - UserID: user.ID, - Message: message, - }, - ) - - if err != nil { - fmt.Printf("Error inserting message: %v\n", err) + fmt.Printf("Error getting user: %v\n", err) return } - m.socketManager.BroadcastText( - h.Render(MessageRow(message)), + saved := m.service.InsertMessage( + &user, + e.RoomId, + message, ) + + if saved != nil { + m.socketManager.BroadcastText( + h.Render(MessageRow(saved)), + ) + } } diff --git a/examples/chat/chat/component.go b/examples/chat/chat/component.go index 2a8c066..4d59429 100644 --- a/examples/chat/chat/component.go +++ b/examples/chat/chat/component.go @@ -1,12 +1,20 @@ package chat -import "github.com/maddalax/htmgo/framework/h" +import ( + "github.com/maddalax/htmgo/framework/h" + "time" +) -func MessageRow(text string) *h.Element { +func MessageRow(message *Message) *h.Element { return h.Div( h.Attribute("hx-swap-oob", "beforeend"), h.Class("flex flex-col gap-2 w-full"), h.Id("messages"), - h.Pf(text), + h.Div( + h.Class("flex gap-2 items-center"), + h.Pf(message.UserName), + h.Pf(message.CreatedAt.In(time.Local).Format("01/02 03:04 PM")), + h.Pf(message.Message), + ), ) } diff --git a/examples/chat/chat/service.go b/examples/chat/chat/service.go index 465b2ec..57adf34 100644 --- a/examples/chat/chat/service.go +++ b/examples/chat/chat/service.go @@ -3,9 +3,20 @@ package chat import ( "chat/internal/db" "context" + "fmt" + "github.com/google/uuid" "github.com/maddalax/htmgo/framework/service" + "log" + "time" ) +type Message struct { + UserId int64 `json:"userId"` + UserName string `json:"userName"` + Message string `json:"message"` + CreatedAt time.Time `json:"createdAt"` +} + type Service struct { queries *db.Queries } @@ -16,6 +27,54 @@ func NewService(locator *service.Locator) *Service { } } +func (s *Service) InsertMessage(user *db.User, roomId string, message string) *Message { + err := s.queries.InsertMessage(context.Background(), db.InsertMessageParams{ + UserID: user.ID, + Username: user.Name, + ChatRoomID: roomId, + Message: message, + }) + if err != nil { + log.Printf("Failed to insert message: %v\n", err) + return nil + } + return &Message{ + UserId: user.ID, + UserName: user.Name, + Message: message, + CreatedAt: time.Now(), + } +} + +func (s *Service) GetUserBySession(sessionId string) (*db.User, error) { + user, err := s.queries.GetUserBySessionId(context.Background(), sessionId) + return &user, err +} + +func (s *Service) CreateUser(name string) (*db.CreateUserRow, error) { + nameWithHash := fmt.Sprintf("%s#%s", name, uuid.NewString()[0:4]) + sessionId := fmt.Sprintf("session-%s-%s", uuid.NewString(), uuid.NewString()) + user, err := s.queries.CreateUser(context.Background(), db.CreateUserParams{ + Name: nameWithHash, + SessionID: sessionId, + }) + if err != nil { + return nil, err + } + return &user, nil +} + +func (s *Service) CreateRoom(name string) (*db.CreateChatRoomRow, error) { + room, err := s.queries.CreateChatRoom(context.Background(), db.CreateChatRoomParams{ + ID: fmt.Sprintf("room-%s-%s", uuid.NewString()[0:8], name), + Name: name, + }) + if err != nil { + return nil, err + } + return &room, nil +} + func (s *Service) GetRoom(id string) (*db.ChatRoom, error) { room, err := s.queries.GetChatRoom(context.Background(), id) if err != nil { diff --git a/examples/chat/internal/db/models.go b/examples/chat/internal/db/models.go index 71aadfb..7b3a08a 100644 --- a/examples/chat/internal/db/models.go +++ b/examples/chat/internal/db/models.go @@ -20,6 +20,7 @@ type Message struct { ID int64 ChatRoomID string UserID int64 + Username string Message string CreatedAt string UpdatedAt string @@ -30,4 +31,5 @@ type User struct { Name string CreatedAt string UpdatedAt string + SessionID string } diff --git a/examples/chat/internal/db/queries.sql b/examples/chat/internal/db/queries.sql index 597223e..46e51d8 100644 --- a/examples/chat/internal/db/queries.sql +++ b/examples/chat/internal/db/queries.sql @@ -1,12 +1,12 @@ -- name: CreateChatRoom :one -INSERT INTO chat_rooms (name, created_at, updated_at) -VALUES (?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +INSERT INTO chat_rooms (id, name, created_at, updated_at) +VALUES (?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) RETURNING id, name, created_at, updated_at, last_message_sent_at; -- name: InsertMessage :exec -INSERT INTO messages (chat_room_id, user_id, message, created_at, updated_at) -VALUES (?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) -RETURNING id, chat_room_id, user_id, message, created_at, updated_at; +INSERT INTO messages (chat_room_id, user_id, username, message, created_at, updated_at) +VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +RETURNING id, chat_room_id, user_id, username, message, created_at, updated_at; -- name: UpdateChatRoomLastMessageSentAt :exec UPDATE chat_rooms @@ -24,9 +24,9 @@ FROM chat_rooms WHERE chat_rooms.id = ?; -- name: CreateUser :one -INSERT INTO users (name, created_at, updated_at) -VALUES (?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) -RETURNING id, name, created_at, updated_at; +INSERT INTO users (name, session_id, created_at, updated_at) +VALUES (?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +RETURNING id, name, session_id, created_at, updated_at; -- name: GetLastMessages :many SELECT @@ -42,3 +42,6 @@ FROM messages WHERE messages.chat_room_id = ? ORDER BY messages.created_at LIMIT ?; + +-- name: GetUserBySessionId :one +SELECT * FROM users WHERE session_id = ?; diff --git a/examples/chat/internal/db/queries.sql.go b/examples/chat/internal/db/queries.sql.go index 8d7cc09..42ee1af 100644 --- a/examples/chat/internal/db/queries.sql.go +++ b/examples/chat/internal/db/queries.sql.go @@ -11,11 +11,16 @@ import ( ) const createChatRoom = `-- name: CreateChatRoom :one -INSERT INTO chat_rooms (name, created_at, updated_at) -VALUES (?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +INSERT INTO chat_rooms (id, name, created_at, updated_at) +VALUES (?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) RETURNING id, name, created_at, updated_at, last_message_sent_at ` +type CreateChatRoomParams struct { + ID string + Name string +} + type CreateChatRoomRow struct { ID string Name string @@ -24,8 +29,8 @@ type CreateChatRoomRow struct { LastMessageSentAt sql.NullString } -func (q *Queries) CreateChatRoom(ctx context.Context, name string) (CreateChatRoomRow, error) { - row := q.db.QueryRowContext(ctx, createChatRoom, name) +func (q *Queries) CreateChatRoom(ctx context.Context, arg CreateChatRoomParams) (CreateChatRoomRow, error) { + row := q.db.QueryRowContext(ctx, createChatRoom, arg.ID, arg.Name) var i CreateChatRoomRow err := row.Scan( &i.ID, @@ -38,17 +43,31 @@ func (q *Queries) CreateChatRoom(ctx context.Context, name string) (CreateChatRo } const createUser = `-- name: CreateUser :one -INSERT INTO users (name, created_at, updated_at) -VALUES (?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) -RETURNING id, name, created_at, updated_at +INSERT INTO users (name, session_id, created_at, updated_at) +VALUES (?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +RETURNING id, name, session_id, created_at, updated_at ` -func (q *Queries) CreateUser(ctx context.Context, name string) (User, error) { - row := q.db.QueryRowContext(ctx, createUser, name) - var i User +type CreateUserParams struct { + Name string + SessionID string +} + +type CreateUserRow struct { + ID int64 + Name string + SessionID string + CreatedAt string + UpdatedAt string +} + +func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (CreateUserRow, error) { + row := q.db.QueryRowContext(ctx, createUser, arg.Name, arg.SessionID) + var i CreateUserRow err := row.Scan( &i.ID, &i.Name, + &i.SessionID, &i.CreatedAt, &i.UpdatedAt, ) @@ -141,20 +160,43 @@ func (q *Queries) GetLastMessages(ctx context.Context, arg GetLastMessagesParams return items, nil } +const getUserBySessionId = `-- name: GetUserBySessionId :one +SELECT id, name, created_at, updated_at, session_id FROM users WHERE session_id = ? +` + +func (q *Queries) GetUserBySessionId(ctx context.Context, sessionID string) (User, error) { + row := q.db.QueryRowContext(ctx, getUserBySessionId, sessionID) + var i User + err := row.Scan( + &i.ID, + &i.Name, + &i.CreatedAt, + &i.UpdatedAt, + &i.SessionID, + ) + return i, err +} + const insertMessage = `-- name: InsertMessage :exec -INSERT INTO messages (chat_room_id, user_id, message, created_at, updated_at) -VALUES (?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) -RETURNING id, chat_room_id, user_id, message, created_at, updated_at +INSERT INTO messages (chat_room_id, user_id, username, message, created_at, updated_at) +VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) +RETURNING id, chat_room_id, user_id, username, message, created_at, updated_at ` type InsertMessageParams struct { ChatRoomID string UserID int64 + Username string Message string } func (q *Queries) InsertMessage(ctx context.Context, arg InsertMessageParams) error { - _, err := q.db.ExecContext(ctx, insertMessage, arg.ChatRoomID, arg.UserID, arg.Message) + _, err := q.db.ExecContext(ctx, insertMessage, + arg.ChatRoomID, + arg.UserID, + arg.Username, + arg.Message, + ) return err } diff --git a/examples/chat/internal/db/schema.sql b/examples/chat/internal/db/schema.sql index 01c0f80..faf0c14 100644 --- a/examples/chat/internal/db/schema.sql +++ b/examples/chat/internal/db/schema.sql @@ -3,12 +3,13 @@ CREATE TABLE IF NOT EXISTS users id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP + updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + session_id TEXT NOT NULL ) STRICT; CREATE TABLE IF NOT EXISTS chat_rooms ( - id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))), -- Generates a UUID + id TEXT PRIMARY KEY, name TEXT NOT NULL, last_message_sent_at TEXT, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -20,6 +21,7 @@ CREATE TABLE IF NOT EXISTS messages id INTEGER PRIMARY KEY AUTOINCREMENT, chat_room_id TEXT NOT NULL, user_id INTEGER NOT NULL, + username TEXT NOT NULL, message TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, diff --git a/examples/chat/main.go b/examples/chat/main.go index dc16ca7..103077c 100644 --- a/examples/chat/main.go +++ b/examples/chat/main.go @@ -39,7 +39,7 @@ func main() { http.FileServerFS(sub) app.Router.Handle("/public/*", http.StripPrefix("/public", http.FileServerFS(sub))) - app.Router.Handle("/chat", ws.Handle()) + app.Router.Handle("/ws/chat/{id}", ws.Handle()) __htmgo.Register(app.Router) }, diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index f695264..86d3373 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -1,12 +1,15 @@ package pages import ( + "fmt" + "github.com/go-chi/chi/v5" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/hx" "github.com/maddalax/htmgo/framework/js" ) func ChatRoom(ctx *h.RequestContext) *h.Page { + roomId := chi.URLParam(ctx.Request, "id") return h.NewPage( RootPage( h.Div( @@ -14,13 +17,32 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { h.TriggerChildren(), h.HxExtension("ws"), ), - h.Attribute("ws-connect", "/chat"), - h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), - Form(ctx), + h.Attribute("ws-connect", fmt.Sprintf("/ws/chat/%s", roomId)), + h.Class("flex flex-row gap-4 min-h-screen bg-neutral-100"), + + // Sidebar for connected users + UserSidebar(), + + // Chat Area h.Div( + h.Class("flex flex-col flex-grow gap-4 bg-white shadow-md rounded-lg p-4"), + + h.OnEvent("hx-on::ws-after-message", + // language=JavaScript + js.EvalJsOnSibling("#messages", ` + element.scrollTop = element.scrollHeight; + `)), + + // Chat Messages h.Div( h.Id("messages"), - h.Class("flex flex-col gap-2 w-full"), + h.Class("flex flex-col gap-2 overflow-auto grow w-full"), + ), + + // Chat Input at the bottom + h.Div( + h.Class("mt-auto"), + Form(ctx), ), ), ), @@ -28,13 +50,27 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { ) } +func UserSidebar() *h.Element { + return h.Div( + h.Class("w-64 bg-slate-200 p-4 flex flex-col gap-4 rounded-l-lg"), + h.H2F("Connected Users", h.Class("text-lg font-bold")), + h.Ul( + h.Class("flex flex-col gap-2"), + // This would be populated dynamically with connected users + h.Li(h.Text("User 1"), h.Class("text-slate-700")), + h.Li(h.Text("User 2"), h.Class("text-slate-700")), + h.Li(h.Text("User 3"), h.Class("text-slate-700")), + ), + ) +} + func MessageInput() *h.Element { return h.Input("text", h.Id("message-input"), h.Required(), - h.Class("p-4 rounded-md border border-slate-200"), + h.Class("p-4 rounded-md border border-slate-200 w-full"), h.Name("message"), - h.Placeholder("Message"), + h.Placeholder("Type a message..."), h.HxBeforeWsSend( js.SetValue(""), ), @@ -44,40 +80,11 @@ func MessageInput() *h.Element { func Form(ctx *h.RequestContext) *h.Element { return h.Div( - h.Class("flex flex-col items-center justify-center p-4 gap-6"), - h.H2F("Form submission with ws example", h.Class("text-2xl font-bold")), + h.Class("flex gap-4 items-center"), h.Form( h.Attribute("ws-send", ""), - h.Class("flex flex-col gap-2"), - h.LabelFor("name", "Your Message"), + h.Class("flex flex-grow"), MessageInput(), - SubmitButton(), - ), - ) -} - -func SubmitButton() *h.Element { - buttonClasses := "rounded items-center px-3 py-2 bg-slate-800 text-white w-full text-center" - return h.Div( - h.HxBeforeRequest( - js.RemoveClassOnChildren(".loading", "hidden"), - js.SetClassOnChildren(".submit", "hidden"), - ), - h.HxAfterRequest( - js.SetClassOnChildren(".loading", "hidden"), - js.RemoveClassOnChildren(".submit", "hidden"), - ), - h.Class("flex gap-2 justify-center"), - h.Button( - h.Class("loading hidden relative text-center", buttonClasses), - Spinner(), - h.Disabled(), - h.Text("Submitting..."), - ), - h.Button( - h.Type("submit"), - h.Class("submit", buttonClasses), - h.Text("Submit"), ), ) } @@ -85,7 +92,7 @@ func SubmitButton() *h.Element { func Spinner(children ...h.Ren) *h.Element { return h.Div( h.Children(children...), - h.Class("absolute left-1 spinner spinner-border animate-spin inline-block w-6 h-6 border-4 rounded-full border-slate-200 border-t-transparent"), + h.Class("spinner spinner-border animate-spin w-4 h-4 border-2 border-t-transparent"), h.Attribute("role", "status"), ) } diff --git a/examples/chat/partials/index.go b/examples/chat/partials/index.go index d9b3c98..008bb2f 100644 --- a/examples/chat/partials/index.go +++ b/examples/chat/partials/index.go @@ -4,26 +4,59 @@ import ( "chat/chat" "chat/components" "github.com/maddalax/htmgo/framework/h" + "net/http" ) func CreateOrJoinRoom(ctx *h.RequestContext) *h.Partial { locator := ctx.ServiceLocator() service := chat.NewService(locator) - chatRoomId := ctx.FormValue("join-chat-room") + chatRoomId := ctx.Request.FormValue("join-chat-room") + username := ctx.Request.FormValue("username") + + if username == "" { + return h.SwapPartial(ctx, components.FormError("Username is required")) + } + + user, err := service.CreateUser(username) + + if err != nil { + return h.SwapPartial(ctx, components.FormError("Failed to create user")) + } + + var redirect = func(path string) *h.Partial { + cookie := &http.Cookie{ + Name: "session_id", + Value: user.SessionID, + Path: "/", + } + return h.SwapManyPartialWithHeaders( + ctx, + h.NewHeaders( + "Set-Cookie", cookie.String(), + "HX-Redirect", path, + ), + h.Fragment(), + ) + } if chatRoomId != "" { room, _ := service.GetRoom(chatRoomId) if room == nil { return h.SwapPartial(ctx, components.FormError("Room not found")) } else { - return h.RedirectPartial("/chat/" + chatRoomId) + return redirect("/chat/" + chatRoomId) } } - chatRoomName := ctx.FormValue("chat-room-name") + chatRoomName := ctx.Request.FormValue("new-chat-room") if chatRoomName != "" { - // create room + room, _ := service.CreateRoom(chatRoomName) + if room == nil { + return h.SwapPartial(ctx, components.FormError("Failed to create room")) + } else { + return redirect("/chat/" + room.ID) + } } return h.SwapPartial(ctx, components.FormError("Create a new room or join an existing one")) diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go index cbe04be..8ca07de 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/ws/handler.go @@ -4,7 +4,7 @@ import ( "context" "github.com/coder/websocket" "github.com/coder/websocket/wsjson" - "github.com/google/uuid" + "github.com/go-chi/chi/v5" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" "net/http" @@ -12,8 +12,20 @@ import ( func Handle() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - c, err := websocket.Accept(w, r, nil) cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) + + sessionCookie, err := r.Cookie("session_id") + + cookies := r.Cookies() + + println(cookies) + // no session + if err != nil { + return + } + + c, err := websocket.Accept(w, r, nil) + locator := cc.ServiceLocator() manager := service.Get[SocketManager](locator) @@ -21,22 +33,30 @@ func Handle() http.HandlerFunc { return } - id := uuid.NewString() - manager.Add(id, c) + sessionId := sessionCookie.Value + + roomId := chi.URLParam(r, "id") + + if roomId == "" { + manager.CloseWithError(sessionId, "invalid room") + return + } + + manager.Add(roomId, sessionId, c) defer func() { - manager.Disconnect(id) + manager.Disconnect(sessionId) }() for { var v map[string]any err = wsjson.Read(context.Background(), c, &v) if err != nil { - manager.CloseWithError(id, "failed to read message") + manager.CloseWithError(sessionId, "failed to read message") return } if v != nil { - manager.OnMessage(id, v) + manager.OnMessage(sessionId, v) } } diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index 1cd60b8..4098dee 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -17,18 +17,25 @@ const ( type SocketEvent struct { Id string + RoomId string Type EventType Payload map[string]any } +type SocketConnection struct { + Id string + Conn *websocket.Conn + RoomId string +} + type SocketManager struct { - sockets *xsync.MapOf[string, *websocket.Conn] + sockets *xsync.MapOf[string, SocketConnection] listeners []chan SocketEvent } func NewSocketManager() *SocketManager { return &SocketManager{ - sockets: xsync.NewMapOf[string, *websocket.Conn](), + sockets: xsync.NewMapOf[string, SocketConnection](), } } @@ -46,26 +53,41 @@ func (manager *SocketManager) dispatch(event SocketEvent) { } func (manager *SocketManager) OnMessage(id string, message map[string]any) { + socket := manager.Get(id) + if socket == nil { + return + } manager.dispatch(SocketEvent{ Id: id, Type: MessageEvent, Payload: message, + RoomId: socket.RoomId, }) } -func (manager *SocketManager) Add(id string, conn *websocket.Conn) { - manager.sockets.Store(id, conn) +func (manager *SocketManager) Add(roomId string, id string, conn *websocket.Conn) { + manager.sockets.Store(id, SocketConnection{ + Id: id, + Conn: conn, + RoomId: roomId, + }) manager.dispatch(SocketEvent{ Id: id, Type: ConnectedEvent, + RoomId: roomId, Payload: map[string]any{}, }) } func (manager *SocketManager) OnClose(id string) { + socket := manager.Get(id) + if socket == nil { + return + } manager.dispatch(SocketEvent{ Id: id, Type: DisconnectedEvent, + RoomId: socket.RoomId, Payload: map[string]any{}, }) manager.sockets.Delete(id) @@ -75,7 +97,7 @@ func (manager *SocketManager) CloseWithError(id string, message string) { conn := manager.Get(id) if conn != nil { defer manager.OnClose(id) - conn.Close(websocket.StatusInternalError, message) + conn.Conn.Close(websocket.StatusInternalError, message) } } @@ -83,19 +105,22 @@ func (manager *SocketManager) Disconnect(id string) { conn := manager.Get(id) if conn != nil { defer manager.OnClose(id) - _ = conn.CloseNow() + _ = conn.Conn.CloseNow() } } -func (manager *SocketManager) Get(id string) *websocket.Conn { - conn, _ := manager.sockets.Load(id) - return conn +func (manager *SocketManager) Get(id string) *SocketConnection { + conn, ok := manager.sockets.Load(id) + if !ok { + return nil + } + return &conn } func (manager *SocketManager) Broadcast(message []byte, messageType websocket.MessageType) { ctx := context.Background() - manager.sockets.Range(func(id string, conn *websocket.Conn) bool { - err := conn.Write(ctx, messageType, message) + manager.sockets.Range(func(id string, conn SocketConnection) bool { + err := conn.Conn.Write(ctx, messageType, message) if err != nil { manager.Disconnect(id) } @@ -111,6 +136,6 @@ func (manager *SocketManager) BroadcastText(message string) { func (manager *SocketManager) SendText(id string, message string) { conn := manager.Get(id) if conn != nil { - _ = conn.Write(context.Background(), websocket.MessageText, []byte(message)) + _ = conn.Conn.Write(context.Background(), websocket.MessageText, []byte(message)) } } diff --git a/framework/h/app.go b/framework/h/app.go index 1780a76..51547cf 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -16,7 +16,8 @@ import ( ) type RequestContext struct { - *http.Request + Request *http.Request + Response http.ResponseWriter locator *service.Locator isBoosted bool currentBrowserUrl string @@ -118,9 +119,10 @@ func (app *App) start() { app.Router.Use(func(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { cc := &RequestContext{ - locator: app.Opts.ServiceLocator, - Request: r, - kv: make(map[string]interface{}), + locator: app.Opts.ServiceLocator, + Request: r, + Response: w, + kv: make(map[string]interface{}), } populateHxFields(cc) ctx := context.WithValue(r.Context(), RequestContextKey, cc) diff --git a/framework/h/base.go b/framework/h/base.go index 9301ef8..01ecd76 100644 --- a/framework/h/base.go +++ b/framework/h/base.go @@ -1,7 +1,6 @@ package h import ( - "github.com/maddalax/htmgo/framework/hx" "html" "net/http" "reflect" @@ -57,10 +56,6 @@ func SwapPartial(ctx *RequestContext, swap *Element) *Partial { SwapMany(ctx, swap)) } -func RedirectPartial(url string) *Partial { - return NewPartialWithHeaders(NewHeaders(hx.RedirectHeader, url), Fragment()) -} - func SwapManyPartial(ctx *RequestContext, swaps ...*Element) *Partial { return NewPartial( SwapMany(ctx, swaps...), diff --git a/framework/h/header.go b/framework/h/header.go index 70645db..aba7c0a 100644 --- a/framework/h/header.go +++ b/framework/h/header.go @@ -34,7 +34,7 @@ func CombineHeaders(headers ...*Headers) *Headers { } func CurrentPath(ctx *RequestContext) string { - current := ctx.Header.Get(hx.CurrentUrlHeader) + current := ctx.Request.Header.Get(hx.CurrentUrlHeader) parsed, err := url.Parse(current) if err != nil { return "" diff --git a/framework/h/qs.go b/framework/h/qs.go index 31b2b93..75fad83 100644 --- a/framework/h/qs.go +++ b/framework/h/qs.go @@ -49,7 +49,7 @@ func (q *Qs) ToString() string { } func GetQueryParam(ctx *RequestContext, key string) string { - value, ok := ctx.URL.Query()[key] + value, ok := ctx.Request.URL.Query()[key] if value == nil || !ok { current := ctx.currentBrowserUrl if current != "" { From 5233bbb234f74555b68e7424fe1fe2d0cbdc976b Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 30 Sep 2024 22:49:03 -0500 Subject: [PATCH 06/28] chat semi working --- examples/chat/chat/broadcast.go | 37 ++++++++++++++++++++++++++++++--- examples/chat/chat/component.go | 25 ++++++++++++++++++++++ examples/chat/pages/chat.$id.go | 15 +++++-------- examples/chat/ws/manager.go | 17 +++++++++++++-- 4 files changed, 79 insertions(+), 15 deletions(-) diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 3042704..019bae3 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -33,10 +33,9 @@ func (m *Manager) StartListener() { case event := <-c: switch event.Type { case ws.ConnectedEvent: - fmt.Printf("User %s connected\n", event.Id) - m.backFill(event.Id, event.RoomId) + m.OnConnected(event) case ws.DisconnectedEvent: - fmt.Printf("User %s disconnected\n", event.Id) + m.OnDisconnected(event) case ws.MessageEvent: m.onMessage(event) } @@ -44,6 +43,38 @@ func (m *Manager) StartListener() { } } +func (m *Manager) OnConnected(e ws.SocketEvent) { + fmt.Printf("User %s connected to room %s\n", e.Id, e.RoomId) + user, err := m.queries.GetUserBySessionId(context.Background(), e.Id) + + if err != nil { + return + } + + m.socketManager.BroadcastText(h.Render(ConnectedUsers(user.Name))) + m.socketManager.ForEachSocket(e.RoomId, func(conn ws.SocketConnection) { + if conn.Id == e.Id { + return + } + user, err := m.queries.GetUserBySessionId(context.Background(), conn.Id) + if err != nil { + return + } + m.socketManager.SendText(e.Id, h.Render(ConnectedUsers(user.Name))) + }) + + go m.backFill(e.Id, e.RoomId) +} + +func (m *Manager) OnDisconnected(e ws.SocketEvent) { + fmt.Printf("User %s disconnected\n", e.Id) + user, err := m.queries.GetUserBySessionId(context.Background(), e.Id) + if err != nil { + return + } + m.socketManager.BroadcastText(h.Render(ConnectedUser(user.Name, true))) +} + func (m *Manager) backFill(socketId string, roomId string) { messages, _ := m.queries.GetLastMessages(context.Background(), db.GetLastMessagesParams{ ChatRoomID: roomId, diff --git a/examples/chat/chat/component.go b/examples/chat/chat/component.go index 4d59429..ab445eb 100644 --- a/examples/chat/chat/component.go +++ b/examples/chat/chat/component.go @@ -1,7 +1,9 @@ package chat import ( + "fmt" "github.com/maddalax/htmgo/framework/h" + "strings" "time" ) @@ -18,3 +20,26 @@ func MessageRow(message *Message) *h.Element { ), ) } + +func ConnectedUsers(username string) *h.Element { + return h.Ul( + h.Attribute("hx-swap", "none"), + h.Attribute("hx-swap-oob", "beforeend"), + h.Id("connected-users"), + h.Class("flex flex-col gap-2"), + // This would be populated dynamically with connected users + ConnectedUser(username, false), + ) +} + +func ConnectedUser(username string, remove bool) *h.Element { + id := fmt.Sprintf("connected-user-%s", strings.ReplaceAll(username, "#", "-")) + if remove { + return h.Div(h.Id(id), h.Attribute("hx-swap-oob", "delete")) + } + return h.Li( + h.Id(id), + h.Class("text-slate-700"), + h.Text(username), + ) +} diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 86d3373..092bdb9 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -1,6 +1,7 @@ package pages import ( + "chat/chat" "fmt" "github.com/go-chi/chi/v5" "github.com/maddalax/htmgo/framework/h" @@ -18,14 +19,14 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { h.HxExtension("ws"), ), h.Attribute("ws-connect", fmt.Sprintf("/ws/chat/%s", roomId)), - h.Class("flex flex-row gap-4 min-h-screen bg-neutral-100"), + h.Class("flex flex-row min-h-screen bg-neutral-100"), // Sidebar for connected users UserSidebar(), // Chat Area h.Div( - h.Class("flex flex-col flex-grow gap-4 bg-white shadow-md rounded-lg p-4"), + h.Class("flex flex-col flex-grow gap-4 bg-white rounded p-4"), h.OnEvent("hx-on::ws-after-message", // language=JavaScript @@ -52,15 +53,9 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { func UserSidebar() *h.Element { return h.Div( - h.Class("w-64 bg-slate-200 p-4 flex flex-col gap-4 rounded-l-lg"), + h.Class("w-48 bg-slate-200 p-4 flex flex-col gap-3 rounded-l-lg"), h.H2F("Connected Users", h.Class("text-lg font-bold")), - h.Ul( - h.Class("flex flex-col gap-2"), - // This would be populated dynamically with connected users - h.Li(h.Text("User 1"), h.Class("text-slate-700")), - h.Li(h.Text("User 2"), h.Class("text-slate-700")), - h.Li(h.Text("User 3"), h.Class("text-slate-700")), - ), + chat.ConnectedUsers(""), ) } diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index 4098dee..67b254c 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -39,6 +39,15 @@ func NewSocketManager() *SocketManager { } } +func (manager *SocketManager) ForEachSocket(roomId string, cb func(conn SocketConnection)) { + manager.sockets.Range(func(id string, conn SocketConnection) bool { + if conn.RoomId == roomId { + cb(conn) + } + return true + }) +} + func (manager *SocketManager) Listen(listener chan SocketEvent) { if manager.listeners == nil { manager.listeners = make([]chan SocketEvent, 0) @@ -71,10 +80,14 @@ func (manager *SocketManager) Add(roomId string, id string, conn *websocket.Conn Conn: conn, RoomId: roomId, }) + s, ok := manager.sockets.Load(id) + if !ok { + return + } manager.dispatch(SocketEvent{ - Id: id, + Id: s.Id, Type: ConnectedEvent, - RoomId: roomId, + RoomId: s.RoomId, Payload: map[string]any{}, }) } From 784995728cb9fb56e5a89c1eda6e4191b2eb96f0 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 12:09:22 -0500 Subject: [PATCH 07/28] add error handling --- examples/chat/chat/broadcast.go | 9 ++++ examples/chat/pages/chat.$id.go | 31 +++++++++---- examples/chat/partials/index.go | 8 ++-- examples/chat/ws/handler.go | 29 +++++++------ examples/chat/ws/manager.go | 8 ++-- framework/assets/dist/htmgo.js | 4 +- .../js/htmxextensions/trigger-children.ts | 7 ++- framework/assets/js/htmxextensions/ws.ts | 13 +++--- framework/h/lifecycle.go | 43 ++++++++++++++++++- framework/h/renderer.go | 7 +-- framework/hx/htmx.go | 6 +++ framework/js/commands.go | 2 + .../md/docs/4_interactivity/2_events.md | 2 + 13 files changed, 127 insertions(+), 42 deletions(-) diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 019bae3..7c9e2a7 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -5,6 +5,7 @@ import ( "chat/ws" "context" "fmt" + "github.com/coder/websocket" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" "time" @@ -44,7 +45,15 @@ func (m *Manager) StartListener() { } func (m *Manager) OnConnected(e ws.SocketEvent) { + room, _ := m.service.GetRoom(e.RoomId) + + if room == nil { + m.socketManager.CloseWithError(e.Id, websocket.StatusPolicyViolation, "invalid room") + return + } + fmt.Printf("User %s connected to room %s\n", e.Id, e.RoomId) + user, err := m.queries.GetUserBySessionId(context.Background(), e.Id) if err != nil { diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 092bdb9..0d2ebca 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/go-chi/chi/v5" "github.com/maddalax/htmgo/framework/h" - "github.com/maddalax/htmgo/framework/hx" "github.com/maddalax/htmgo/framework/js" ) @@ -18,7 +17,24 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { h.TriggerChildren(), h.HxExtension("ws"), ), + h.Attribute("ws-connect", fmt.Sprintf("/ws/chat/%s", roomId)), + + h.HxOnWsOpen( + js.ConsoleLog("Connected to chat room"), + ), + + h.HxOnWsClose( + js.EvalJs(` + const reason = e.detail.event.reason + if(['invalid room', 'no session'].includes(reason)) { + window.location.href = '/'; + } else { + console.error('Connection closed:', e.detail.event) + } + `), + ), + h.Class("flex flex-row min-h-screen bg-neutral-100"), // Sidebar for connected users @@ -28,11 +44,11 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { h.Div( h.Class("flex flex-col flex-grow gap-4 bg-white rounded p-4"), - h.OnEvent("hx-on::ws-after-message", - // language=JavaScript - js.EvalJsOnSibling("#messages", ` - element.scrollTop = element.scrollHeight; - `)), + h.HxAfterWsMessage( + js.EvalJsOnSibling("#messages", + // language=JavaScript + `element.scrollTop = element.scrollHeight;`), + ), // Chat Messages h.Div( @@ -66,10 +82,9 @@ func MessageInput() *h.Element { h.Class("p-4 rounded-md border border-slate-200 w-full"), h.Name("message"), h.Placeholder("Type a message..."), - h.HxBeforeWsSend( + h.HxAfterWsSend( js.SetValue(""), ), - h.OnEvent(hx.KeyDownEvent, js.SubmitFormOnEnter()), ) } diff --git a/examples/chat/partials/index.go b/examples/chat/partials/index.go index 008bb2f..ae86ea8 100644 --- a/examples/chat/partials/index.go +++ b/examples/chat/partials/index.go @@ -5,6 +5,7 @@ import ( "chat/components" "github.com/maddalax/htmgo/framework/h" "net/http" + "time" ) func CreateOrJoinRoom(ctx *h.RequestContext) *h.Partial { @@ -26,9 +27,10 @@ func CreateOrJoinRoom(ctx *h.RequestContext) *h.Partial { var redirect = func(path string) *h.Partial { cookie := &http.Cookie{ - Name: "session_id", - Value: user.SessionID, - Path: "/", + Name: "session_id", + Value: user.SessionID, + Path: "/", + Expires: time.Now().Add(24 * 30 * time.Hour), } return h.SwapManyPartialWithHeaders( ctx, diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go index 8ca07de..5281dea 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/ws/handler.go @@ -7,6 +7,7 @@ import ( "github.com/go-chi/chi/v5" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" + "log/slog" "net/http" ) @@ -14,31 +15,30 @@ func Handle() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) - sessionCookie, err := r.Cookie("session_id") - - cookies := r.Cookies() - - println(cookies) - // no session - if err != nil { - return - } + sessionCookie, _ := r.Cookie("session_id") c, err := websocket.Accept(w, r, nil) - locator := cc.ServiceLocator() - manager := service.Get[SocketManager](locator) - if err != nil { return } + if sessionCookie == nil { + slog.Error("session cookie not found") + c.Close(websocket.StatusPolicyViolation, "no session") + return + } + + locator := cc.ServiceLocator() + manager := service.Get[SocketManager](locator) + sessionId := sessionCookie.Value roomId := chi.URLParam(r, "id") if roomId == "" { - manager.CloseWithError(sessionId, "invalid room") + slog.Error("invalid room", slog.String("room_id", roomId)) + manager.CloseWithError(sessionId, websocket.StatusPolicyViolation, "invalid room") return } @@ -52,7 +52,8 @@ func Handle() http.HandlerFunc { var v map[string]any err = wsjson.Read(context.Background(), c, &v) if err != nil { - manager.CloseWithError(sessionId, "failed to read message") + slog.Error("failed to read message", slog.String("room_id", roomId)) + manager.CloseWithError(sessionId, websocket.StatusInternalError, "failed to read message") return } if v != nil { diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index 67b254c..06bdbd7 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -106,18 +106,18 @@ func (manager *SocketManager) OnClose(id string) { manager.sockets.Delete(id) } -func (manager *SocketManager) CloseWithError(id string, message string) { +func (manager *SocketManager) CloseWithError(id string, code websocket.StatusCode, message string) { conn := manager.Get(id) if conn != nil { - defer manager.OnClose(id) - conn.Conn.Close(websocket.StatusInternalError, message) + go manager.OnClose(id) + conn.Conn.Close(code, message) } } func (manager *SocketManager) Disconnect(id string) { conn := manager.Get(id) if conn != nil { - defer manager.OnClose(id) + go manager.OnClose(id) _ = conn.Conn.CloseNow() } } diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index 3dd012d..dd38524 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var re=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let x=consumeCSSSelector(o);x.length>0&&(s+=" "+x);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),g=l.value;if(c.lastValue===g)return;c.lastValue=g;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(h,b){s=h,l=b;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let g=getInternalData(n),x=g.lastButtonClicked;if(x){let h=getRawAttribute(x,"formaction");h!=null&&(t=h);let b=getRawAttribute(x,"formmethod");b!=null&&b.toLowerCase()!=="dialog"&&(e=b);}let C=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:C})===!1)return maybeCall(s),a;let v=n,E=getClosestAttributeValue(n,"hx-sync"),p=null,T=!1;if(E){let h=E.split(":"),b=h[0].trim();if(b==="this"?v=findThisElement(n,"hx-sync"):v=asElement(querySelectorExt(n,b)),E=(h[1]||"drop").trim(),g=getInternalData(v),E==="drop"&&g.xhr&&g.abortable!==!0)return maybeCall(s),a;if(E==="abort"){if(g.xhr)return maybeCall(s),a;T=!0;}else E==="replace"?triggerEvent(v,"htmx:abort"):E.indexOf("queue")===0&&(p=(E.split(" ")[1]||"last").trim());}if(g.xhr)if(g.abortable)triggerEvent(v,"htmx:abort");else {if(p==null){if(r){let h=getInternalData(r);h&&h.triggerSpec&&h.triggerSpec.queue&&(p=h.triggerSpec.queue);}p==null&&(p="last");}return g.queuedRequests==null&&(g.queuedRequests=[]),p==="first"&&g.queuedRequests.length===0?g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):p==="all"?g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):p==="last"&&(g.queuedRequests=[],g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let y=new XMLHttpRequest;g.xhr=y,g.abortable=T;let R=function(){g.xhr=null,g.abortable=!1,g.queuedRequests!=null&&g.queuedRequests.length>0&&g.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var L=prompt(N);if(L===null||!triggerEvent(n,"htmx:prompt",{prompt:L,target:c}))return maybeCall(s),R(),a}if(C&&!i&&!confirm(C))return maybeCall(s),R(),a;let D=getHeaders(n,c,L);e!=="get"&&!usesFormData(n)&&(D["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(D=mergeObjects(D,o.headers));let S=getInputValues(n,e),q=S.errors,k=S.formData;o.values&&overrideFormData(k,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),j=overrideFormData(k,_),P=filterValues(j,n);htmx.config.getCacheBusterParam&&e==="get"&&P.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,A={boosted:G,useUrlParams:F,formData:P,parameters:formDataProxy(P),unfilteredFormData:j,unfilteredParameters:formDataProxy(j),headers:D,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",A))return maybeCall(s),R(),a;if(t=A.path,e=A.verb,D=A.headers,P=formDataFromObject(A.parameters),q=A.errors,F=A.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",A),maybeCall(s),R(),a;let Y=t.split("#"),te=Y[0],z=Y[1],I=t;if(F&&(I=te,!P.keys().next().done&&(I.indexOf("?")<0?I+="?":I+="&",I+=urlEncode(P),z&&(I+="#"+z))),!verifyPath(n,I,A))return triggerErrorEvent(n,"htmx:invalidPath",A),maybeCall(l),a;if(y.open(e.toUpperCase(),I,!0),y.overrideMimeType("text/html"),y.withCredentials=A.withCredentials,y.timeout=A.timeout,!X.noHeaders){for(let h in D)if(D.hasOwnProperty(h)){let b=D[h];safelySetHeaderValue(y,h,b);}}let w={xhr:y,target:c,requestConfig:A,etc:o,boosted:G,select:d,pathInfo:{requestPath:t,finalRequestPath:I,responsePath:null,anchor:z}};if(y.onload=function(){try{let h=hierarchyForElt(n);if(w.pathInfo.responsePath=getPathFromResponse(y),u(n,w),w.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",w),triggerEvent(n,"htmx:afterOnLoad",w),!bodyContains(n)){let b=null;for(;h.length>0&&b==null;){let O=h.shift();bodyContains(O)&&(b=O);}b&&(triggerEvent(b,"htmx:afterRequest",w),triggerEvent(b,"htmx:afterOnLoad",w));}maybeCall(s),R();}catch(h){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:h},w)),h}},y.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:sendError",w),maybeCall(l),R();},y.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:sendAbort",w),maybeCall(l),R();},y.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:timeout",w),maybeCall(l),R();},!triggerEvent(n,"htmx:beforeRequest",w))return maybeCall(s),R(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(h){forEach([y,y.upload],function(b){b.addEventListener(h,function(O){triggerEvent(n,"htmx:xhr:"+h,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",w);let ne=F?null:encodeParamsForBody(y,n,P);return y.send(ne),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(L,p.swapDelay):L();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),m=re;function oe(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=se(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=ae(s.replace("hx-on::","htmx:"),n.detail);o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}m.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});m.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var H=m.config,W,le="hx-target-";function K(e,t){return e.substring(0,t.length)===t}function ue(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(K(n,"4")||K(n,"5"))&&r.push("error");for(let o=0;o{W=e,H.responseTargetUnsetsError===void 0&&(H.responseTargetUnsetsError=!0),H.responseTargetSetsError===void 0&&(H.responseTargetSetsError=!1),H.responseTargetPrefersExisting===void 0&&(H.responseTargetPrefersExisting=!1),H.responseTargetPrefersRetargetHeader===void 0&&(H.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(H.responseTargetPrefersExisting||H.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,Q(t),!0;if(!t.detail.requestConfig)return !0;let n=ue(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(Q(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});m.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&m.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{m.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";m.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(m.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ce());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ce(){window.location.reload();}var fe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;m.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(fe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var f;function de(e){return e.trim().split(/\s+/)}function ge(e){let t=f.getAttributeValue(e,"hx-ws");if(t){let n=de(t);for(let r=0;rxe(t));n.addEventListener("message",r=>{if(U(e))return;let o=r.data;if(!f.triggerEvent(e,"htmx:wsBeforeMessage",{message:o,socketWrapper:n.publicInterface}))return;f.withExtensions(e,l=>{o=l.transformResponse(o,null,e);});let i=f.makeSettleInfo(e),s=f.makeFragment(o);if(s.children.length){let l=Array.from(s.children);for(let a=0;a0;){let r=this.messageQueue[0];if(this.socket.readyState===this.socket.OPEN)this.sendImmediately(r.message,r.sendElt),this.messageQueue.shift();else break}},init(){this.socket&&this.socket.readyState===this.socket.OPEN&&this.socket.close();let r=t();f.triggerEvent(e,"htmx:wsConnecting",{event:{type:"connecting"}}),this.socket=r,r.onopen=i=>{this.retryCount=0,f.triggerEvent(e,"htmx:wsOpen",{event:i,socketWrapper:this.publicInterface}),this.handleQueuedMessages();},r.onclose=i=>{if(!U(e)&&[1006,1012,1013].indexOf(i.code)>=0){let s=be(this.retryCount);setTimeout(()=>{this.retryCount+=1,this.init();},s);}f.triggerEvent(e,"htmx:wsClose",{event:i,socketWrapper:this.publicInterface});},r.onerror=i=>{f.triggerErrorEvent(e,"htmx:wsError",{error:i,socketWrapper:this}),U(e);};let o=this.events;Object.keys(o).forEach(i=>{o[i].forEach(s=>{r.addEventListener(i,s);});});},close(){this.socket.close();},publicInterface:{}};return n.init(),n.publicInterface={send:n.send.bind(n),sendImmediately:n.sendImmediately.bind(n),queue:n.messageQueue},n}function Ee(e){let t=f.getAttributeValue(e,"hx-ws");if(t&&t!=="send")return;let n=f.getClosestMatch(e,r=>pe(r));n&&ye(n,e);}function pe(e){return f.getInternalData(e).webSocket!=null}function ye(e,t){let n=f.getInternalData(t);f.getTriggerSpecs(t).forEach(o=>{f.addTriggerHandler(t,o,n,(i,s)=>{if(U(e))return;let l=f.getInternalData(e).webSocket,a=f.getHeaders(t,f.getTarget(t)),u=f.getInputValues(t,"post"),d=u.errors,c=Object.assign({},u.values),g=f.getExpressionVars(t),x=f.mergeObjects(c,g),v={parameters:f.filterValues(x,t),unfilteredParameters:x,headers:a,errors:d,triggeringEvent:s,messageBody:void 0,socketWrapper:l.publicInterface};if(!f.triggerEvent(i,"htmx:wsConfigSend",v))return;if(d&&d.length>0){f.triggerEvent(i,"htmx:validation:halted",d);return}let E=v.messageBody;if(E===void 0){let p=Object.assign({},v.parameters);v.headers&&(p.HEADERS=a),E=JSON.stringify(p);}l.send(E,i),s&&f.shouldCancel(s,i)&&s.preventDefault();});});}function be(e){let t=Math.min(e,6);return 1e3*Math.pow(2,t)*Math.random()}function U(e){return f.bodyContains(e)?!1:(f.getInternalData(e).webSocket.close(),!0)}function xe(e){let t=new WebSocket(e,[]);return t.binaryType=m.config.wsBinaryType||"blob",t}function Z(e,t){let n=[];return (f.hasAttribute(e,t)||f.hasAttribute(e,"hx-ws"))&&n.push(e),e.querySelectorAll("["+t+"], [data-"+t+"], [data-hx-ws], [hx-ws]").forEach(r=>{n.push(r);}),n}function ee(e,t){e&&e.forEach(t);}m.defineExtension("ws",{init:e=>{f=e;},onEvent:(e,t)=>{let n=t.target||t.detail.elt;if(n instanceof HTMLElement)switch(e){case"htmx:beforeCleanupElement":J(n);let r=f.getInternalData(n);r.webSocket&&r.webSocket.close();return;case"htmx:beforeProcessNode":ee(Z(n,"ws-connect"),o=>{he(o);}),ee(Z(n,"ws-send"),o=>{Ee(o);});}}});function ve(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}ve((e,t)=>{we(t);});function we(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))m.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),m.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){m.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&m.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let x=consumeCSSSelector(o);x.length>0&&(s+=" "+x);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),g=l.value;if(c.lastValue===g)return;c.lastValue=g;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(h,b){s=h,l=b;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let g=getInternalData(n),x=g.lastButtonClicked;if(x){let h=getRawAttribute(x,"formaction");h!=null&&(t=h);let b=getRawAttribute(x,"formmethod");b!=null&&b.toLowerCase()!=="dialog"&&(e=b);}let C=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:C})===!1)return maybeCall(s),a;let v=n,E=getClosestAttributeValue(n,"hx-sync"),p=null,T=!1;if(E){let h=E.split(":"),b=h[0].trim();if(b==="this"?v=findThisElement(n,"hx-sync"):v=asElement(querySelectorExt(n,b)),E=(h[1]||"drop").trim(),g=getInternalData(v),E==="drop"&&g.xhr&&g.abortable!==!0)return maybeCall(s),a;if(E==="abort"){if(g.xhr)return maybeCall(s),a;T=!0;}else E==="replace"?triggerEvent(v,"htmx:abort"):E.indexOf("queue")===0&&(p=(E.split(" ")[1]||"last").trim());}if(g.xhr)if(g.abortable)triggerEvent(v,"htmx:abort");else {if(p==null){if(r){let h=getInternalData(r);h&&h.triggerSpec&&h.triggerSpec.queue&&(p=h.triggerSpec.queue);}p==null&&(p="last");}return g.queuedRequests==null&&(g.queuedRequests=[]),p==="first"&&g.queuedRequests.length===0?g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):p==="all"?g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):p==="last"&&(g.queuedRequests=[],g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let y=new XMLHttpRequest;g.xhr=y,g.abortable=T;let R=function(){g.xhr=null,g.abortable=!1,g.queuedRequests!=null&&g.queuedRequests.length>0&&g.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var L=prompt(N);if(L===null||!triggerEvent(n,"htmx:prompt",{prompt:L,target:c}))return maybeCall(s),R(),a}if(C&&!i&&!confirm(C))return maybeCall(s),R(),a;let D=getHeaders(n,c,L);e!=="get"&&!usesFormData(n)&&(D["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(D=mergeObjects(D,o.headers));let S=getInputValues(n,e),q=S.errors,k=S.formData;o.values&&overrideFormData(k,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),j=overrideFormData(k,_),P=filterValues(j,n);htmx.config.getCacheBusterParam&&e==="get"&&P.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,A={boosted:G,useUrlParams:M,formData:P,parameters:formDataProxy(P),unfilteredFormData:j,unfilteredParameters:formDataProxy(j),headers:D,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",A))return maybeCall(s),R(),a;if(t=A.path,e=A.verb,D=A.headers,P=formDataFromObject(A.parameters),q=A.errors,M=A.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",A),maybeCall(s),R(),a;let Y=t.split("#"),Z=Y[0],z=Y[1],I=t;if(M&&(I=Z,!P.keys().next().done&&(I.indexOf("?")<0?I+="?":I+="&",I+=urlEncode(P),z&&(I+="#"+z))),!verifyPath(n,I,A))return triggerErrorEvent(n,"htmx:invalidPath",A),maybeCall(l),a;if(y.open(e.toUpperCase(),I,!0),y.overrideMimeType("text/html"),y.withCredentials=A.withCredentials,y.timeout=A.timeout,!X.noHeaders){for(let h in D)if(D.hasOwnProperty(h)){let b=D[h];safelySetHeaderValue(y,h,b);}}let w={xhr:y,target:c,requestConfig:A,etc:o,boosted:G,select:d,pathInfo:{requestPath:t,finalRequestPath:I,responsePath:null,anchor:z}};if(y.onload=function(){try{let h=hierarchyForElt(n);if(w.pathInfo.responsePath=getPathFromResponse(y),u(n,w),w.keepIndicators!==!0&&removeRequestIndicators(F,V),triggerEvent(n,"htmx:afterRequest",w),triggerEvent(n,"htmx:afterOnLoad",w),!bodyContains(n)){let b=null;for(;h.length>0&&b==null;){let O=h.shift();bodyContains(O)&&(b=O);}b&&(triggerEvent(b,"htmx:afterRequest",w),triggerEvent(b,"htmx:afterOnLoad",w));}maybeCall(s),R();}catch(h){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:h},w)),h}},y.onerror=function(){removeRequestIndicators(F,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:sendError",w),maybeCall(l),R();},y.onabort=function(){removeRequestIndicators(F,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:sendAbort",w),maybeCall(l),R();},y.ontimeout=function(){removeRequestIndicators(F,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:timeout",w),maybeCall(l),R();},!triggerEvent(n,"htmx:beforeRequest",w))return maybeCall(s),R(),a;var F=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(h){forEach([y,y.upload],function(b){b.addEventListener(h,function(O){triggerEvent(n,"htmx:xhr:"+h,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",w);let ee=M?null:encodeParamsForBody(y,n,P);return y.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(L,p.swapDelay):L();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),m=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}m.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});m.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var H=m.config,W,ae="hx-target-";function K(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(K(n,"4")||K(n,"5"))&&r.push("error");for(let o=0;o{W=e,H.responseTargetUnsetsError===void 0&&(H.responseTargetUnsetsError=!0),H.responseTargetSetsError===void 0&&(H.responseTargetSetsError=!1),H.responseTargetPrefersExisting===void 0&&(H.responseTargetPrefersExisting=!1),H.responseTargetPrefersRetargetHeader===void 0&&(H.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(H.responseTargetPrefersExisting||H.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,Q(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(Q(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});m.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&m.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{m.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";m.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(m.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;m.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var f;function fe(e){return e.trim().split(/\s+/)}function de(e){let t=f.getAttributeValue(e,"hx-ws");if(t){let n=fe(t);for(let r=0;rbe(t));n.addEventListener("message",r=>{if(U(e))return;let o=r.data;if(!f.triggerEvent(e,"htmx:wsBeforeMessage",{message:o,socketWrapper:n.publicInterface}))return;f.withExtensions(e,l=>{o=l.transformResponse(o,null,e);});let i=f.makeSettleInfo(e),s=f.makeFragment(o);if(s.children.length){let l=Array.from(s.children);for(let a=0;a0;){let r=this.messageQueue[0];if(this.socket.readyState===this.socket.OPEN)this.sendImmediately(r.message,r.sendElt),this.messageQueue.shift();else break}},init(){this.socket&&this.socket.readyState===this.socket.OPEN&&this.socket.close();let r=t();f.triggerEvent(e,"htmx:wsConnecting",{event:{type:"connecting"}}),this.socket=r,r.onopen=i=>{this.retryCount=0,f.triggerEvent(e,"htmx:wsOpen",{event:i,socketWrapper:this.publicInterface}),this.handleQueuedMessages();},r.onclose=i=>{if(!U(e)&&[1006,1012,1013].indexOf(i.code)>=0){let s=ye(this.retryCount);setTimeout(()=>{this.retryCount+=1,this.init();},s);}f.triggerEvent(e,"htmx:wsClose",{event:i,socketWrapper:this.publicInterface});},r.onerror=i=>{f.triggerErrorEvent(e,"htmx:wsError",{error:i,socketWrapper:this}),U(e);};let o=this.events;Object.keys(o).forEach(i=>{o[i].forEach(s=>{r.addEventListener(i,s);});});},close(){this.socket.close();},publicInterface:{}};return n.init(),n.publicInterface={send:n.send.bind(n),sendImmediately:n.sendImmediately.bind(n),queue:n.messageQueue},n}function me(e){let t=f.getAttributeValue(e,"hx-ws");if(t&&t!=="send")return;let n=f.getClosestMatch(e,r=>Ee(r));n&&pe(n,e);}function Ee(e){return f.getInternalData(e).webSocket!=null}function pe(e,t){let n=f.getInternalData(t);f.getTriggerSpecs(t).forEach(o=>{f.addTriggerHandler(t,o,n,(i,s)=>{if(U(e))return;let l=f.getInternalData(e).webSocket,a=f.getHeaders(t,f.getTarget(t)),u=f.getInputValues(t,"post"),d=u.errors,c=Object.assign({},u.values),g=f.getExpressionVars(t),x=f.mergeObjects(c,g),v={parameters:f.filterValues(x,t),unfilteredParameters:x,headers:a,errors:d,triggeringEvent:s,messageBody:void 0,socketWrapper:l.publicInterface};if(!f.triggerEvent(i,"htmx:wsConfigSend",v))return;if(d&&d.length>0){f.triggerEvent(i,"htmx:validation:halted",d);return}let E=v.messageBody;if(E===void 0){let p=Object.assign({},v.parameters);v.headers&&(p.HEADERS=a),E=JSON.stringify(p);}l.send(E,i),s&&f.shouldCancel(s,i)&&s.preventDefault();});});}function ye(e){let t=Math.min(e,6);return 1e3*Math.pow(2,t)*Math.random()}function U(e){return f.bodyContains(e)?!1:(f.getInternalData(e).webSocket.close(),!0)}function be(e){let t=new WebSocket(e,[]);return t.binaryType=m.config.wsBinaryType||"blob",t}m.defineExtension("ws",{init:e=>{f=e;},onEvent:(e,t)=>{let n=t.target||t.detail.elt;if(n instanceof HTMLElement)switch(e){case"htmx:beforeCleanupElement":J(n);let r=f.getInternalData(n);r.webSocket&&r.webSocket.close();return;case"htmx:beforeProcessNode":n.hasAttribute("ws-connect")&&ge(n),n.hasAttribute("ws-send")&&me(n);}}});function xe(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}xe((e,t)=>{ve(t);});function ve(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))m.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),m.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){m.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&m.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy93cy50cyIsIi4uL2pzL2h0bWdvLnRzIl0sIm5hbWVzIjpbImh0bXgiLCJlbHQiLCJ0eXBlIiwidmVyYiIsInRhZyIsImdsb2JhbCIsInN0ciIsImludGVydmFsIiwibmFtZSIsInF1YWxpZmllZE5hbWUiLCJwYXJlbnQiLCJjb25kaXRpb24iLCJpbml0aWFsRWxlbWVudCIsImFuY2VzdG9yIiwiYXR0cmlidXRlTmFtZSIsImF0dHJpYnV0ZVZhbHVlIiwiZGlzaW5oZXJpdCIsImluaGVyaXQiLCJjbG9zZXN0QXR0ciIsImUiLCJzZWxlY3RvciIsIm1hdGNoZXNGdW5jdGlvbiIsIm1hdGNoIiwicmVzcCIsImZyYWdtZW50Iiwic2NyaXB0IiwibmV3U2NyaXB0IiwiYXR0ciIsInJlc3BvbnNlIiwicmVzcG9uc2VXaXRoTm9IZWFkIiwic3RhcnRUYWciLCJkb2MiLCJ0aXRsZUVsZW1lbnQiLCJmdW5jIiwibyIsImRhdGFQcm9wIiwiZGF0YSIsImFyciIsInJldHVybkFyciIsImkiLCJlbCIsInJlY3QiLCJlbGVtVG9wIiwiZWxlbUJvdHRvbSIsInJvb3ROb2RlIiwidHJpZ2dlciIsIm9iajEiLCJvYmoyIiwia2V5IiwialN0cmluZyIsImVycm9yIiwidGVzdCIsInBhdGgiLCJ1cmwiLCJjYWxsYmFjayIsImV2dCIsImV2ZW50IiwiZWx0T3JTZWxlY3RvciIsImRlbGF5IiwidmFsdWUiLCJjbGF6eiIsIm5vZGUiLCJjaGlsZCIsInByZWZpeCIsInN1ZmZpeCIsInRyaW1tZWRTZWxlY3RvciIsInN0YXJ0IiwicmVzdWx0cyIsImNvbnRleHQiLCJhcmcxIiwiYXJnMiIsImFyZzMiLCJldmVudEFyZ3MiLCJhdHRyTmFtZSIsImF0dHJUYXJnZXQiLCJyZXN1bHQiLCJhdHRyaWJ1dGUiLCJ0YXJnZXRTdHIiLCJhdHRyaWJ1dGVzVG9TZXR0bGUiLCJtZXJnZVRvIiwibWVyZ2VGcm9tIiwic3dhcFN0eWxlIiwidGFyZ2V0IiwiZXh0ZW5zaW9ucyIsImV4dGVuc2lvbiIsIm9vYlZhbHVlIiwib29iRWxlbWVudCIsInNldHRsZUluZm8iLCJ0YXJnZXRzIiwib29iRWxlbWVudENsb25lIiwiYmVmb3JlU3dhcERldGFpbHMiLCJwcmVzZXJ2ZWRFbHQiLCJpZCIsIm9sZEVsdCIsInBhcmVudE5vZGUiLCJuZXdOb2RlIiwibm9ybWFsaXplZElkIiwibm9ybWFsaXplZFRhZyIsInBhcmVudEVsdCIsIm9sZE5vZGUiLCJuZXdBdHRyaWJ1dGVzIiwiYXV0b2ZvY3VzIiwiYXV0b0ZvY3VzZWRFbHQiLCJpbnNlcnRCZWZvcmUiLCJzdHJpbmciLCJoYXNoIiwiY2hhciIsImludGVybmFsRGF0YSIsImhhbmRsZXJJbmZvIiwiZWxlbWVudCIsImluZm8iLCJuZXdFbHQiLCJlbHRCZWZvcmVOZXdDb250ZW50IiwiZmlyc3RDaGlsZCIsImV4dCIsIm5ld0VsZW1lbnRzIiwiaiIsIm9vYkVsdHMiLCJjb250ZW50Iiwic3dhcFNwZWMiLCJzd2FwT3B0aW9ucyIsImFjdGl2ZUVsdCIsInNlbGVjdGlvbkluZm8iLCJvb2JTZWxlY3RWYWx1ZXMiLCJvb2JTZWxlY3RWYWx1ZSIsInRlbXBsYXRlIiwibmV3RnJhZ21lbnQiLCJuZXdBY3RpdmVFbHQiLCJmb2N1c09wdGlvbnMiLCJkb1NldHRsZSIsInRhc2siLCJhbmNob3JUYXJnZXQiLCJ4aHIiLCJoZWFkZXIiLCJ0cmlnZ2VyQm9keSIsInRyaWdnZXJzIiwiZXZlbnROYW1lIiwiZGV0YWlsIiwiZXZlbnROYW1lcyIsInRva2VucyIsInBvc2l0aW9uIiwic3RhcnRQb3NpdGlvbiIsInN0YXJ0Q2hhciIsInN5bWJvbCIsInRva2VuIiwibGFzdCIsInBhcmFtTmFtZSIsImJyYWNrZXRDb3VudCIsImNvbmRpdGlvbmFsU291cmNlIiwiY29uZGl0aW9uRnVuY3Rpb24iLCJleHBsaWNpdFRyaWdnZXIiLCJjYWNoZSIsInRyaWdnZXJTcGVjcyIsImluaXRpYWxMZW5ndGgiLCJldmVyeSIsImV2ZW50RmlsdGVyIiwidHJpZ2dlclNwZWMiLCJmcm9tX2FyZyIsImhhbmRsZXIiLCJzcGVjIiwibm9kZURhdGEiLCJyYXdBdHRyaWJ1dGUiLCJzb3VyY2UiLCJleHBsaWNpdENhbmNlbCIsImVsZW1lbnREYXRhIiwiZWx0c1RvTGlzdGVuT24iLCJlbHRUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbkRhdGEiLCJldmVudExpc3RlbmVyIiwiZXZlbnREYXRhIiwibG9hZCIsImV4cGxpY2l0QWN0aW9uIiwib2JzZXJ2ZXJPcHRpb25zIiwiZW50cmllcyIsImF0dHJpYnV0ZXMiLCJlbGVtZW50cyIsIml0ZXIiLCJib29zdGVkU2VsZWN0b3IiLCJleHRlbnNpb25TZWxlY3RvcnMiLCJzZWxlY3RvcnMiLCJzIiwiZm9ybSIsImNvZGUiLCJsaXN0ZW5lciIsImFmdGVyT25Qb3NpdGlvbiIsIm5leHRDaGFyIiwidG9EbyIsIm1zZyIsImV2ZW50UmVzdWx0Iiwia2ViYWJOYW1lIiwia2ViYWJlZEV2ZW50Iiwicm9vdEVsdCIsImlubmVySFRNTCIsInRpdGxlIiwic2Nyb2xsIiwiaGlzdG9yeUNhY2hlIiwibmV3SGlzdG9yeUl0ZW0iLCJjbGFzc05hbWUiLCJjbG9uZSIsImRpc2FibGVIaXN0b3J5Q2FjaGUiLCJ0YXNrcyIsInJlcXVlc3QiLCJkZXRhaWxzIiwiaGlzdG9yeUVsZW1lbnQiLCJjYWNoZWQiLCJpbmRpY2F0b3JzIiwiaWMiLCJkaXNhYmxlZEVsdHMiLCJkaXNhYmxlZEVsZW1lbnQiLCJkaXNhYmxlZCIsInByb2Nlc3NlZCIsImZvcm1EYXRhIiwidiIsInZhbHVlcyIsImVycm9ycyIsInZhbGlkYXRlIiwiaW5wdXQiLCJyZWNlaXZlciIsImRvbm9yIiwicHJpb3JpdHlGb3JtRGF0YSIsImJ1dHRvbiIsImluY2x1ZGVzIiwiZGVzY2VuZGFudCIsInJldHVyblN0ciIsInJlYWxWYWx1ZSIsInByb21wdCIsImhlYWRlcnMiLCJpbnB1dFZhbHVlcyIsInBhcmFtc1ZhbHVlIiwibmV3VmFsdWVzIiwic3dhcEluZm9PdmVycmlkZSIsInN3YXBJbmZvIiwic3BsaXQiLCJzcGxpdFNwZWMiLCJzY3JvbGxWYWwiLCJzZWxlY3RvclZhbCIsInNob3dWYWwiLCJmb2N1c1Njcm9sbFZhbCIsImZpbHRlcmVkUGFyYW1ldGVycyIsImVuY29kZWRQYXJhbWV0ZXJzIiwiZmlyc3QiLCJldmFsQXNEZWZhdWx0IiwiZXZhbHVhdGVWYWx1ZSIsInZhcnNWYWx1ZXMiLCJ0b0V2YWwiLCJkZWZhdWx0VmFsIiwiZXhwcmVzc2lvblZhcnMiLCJoZWFkZXJWYWx1ZSIsInJlZ2V4cCIsInJlcXVlc3RDb25maWciLCJzYW1lSG9zdCIsIm9iaiIsImFycmF5IiwiaW5kZXgiLCJwcm9wIiwiZXRjIiwiY29uZmlybWVkIiwicmVzb2x2ZSIsInJlamVjdCIsInByb21pc2UiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJyZXNwb25zZUhhbmRsZXIiLCJzZWxlY3QiLCJlbHREYXRhIiwic3VibWl0dGVyIiwiYnV0dG9uUGF0aCIsImJ1dHRvblZlcmIiLCJjb25maXJtUXVlc3Rpb24iLCJza2lwQ29uZmlybWF0aW9uIiwic3luY0VsdCIsInN5bmNTdHJhdGVneSIsInF1ZXVlU3RyYXRlZ3kiLCJhYm9ydGFibGUiLCJzeW5jU3RyaW5ncyIsImVuZFJlcXVlc3RMb2NrIiwicHJvbXB0UXVlc3Rpb24iLCJwcm9tcHRSZXNwb25zZSIsInJhd0Zvcm1EYXRhIiwiYWxsRm9ybURhdGEiLCJmaWx0ZXJlZEZvcm1EYXRhIiwicmVxdWVzdEF0dHJWYWx1ZXMiLCJlbHRJc0Jvb3N0ZWQiLCJ1c2VVcmxQYXJhbXMiLCJzcGxpdFBhdGgiLCJwYXRoTm9BbmNob3IiLCJhbmNob3IiLCJmaW5hbFBhdGgiLCJyZXNwb25zZUluZm8iLCJoaWVyYXJjaHkiLCJkaXNhYmxlRWx0cyIsInNlY29uZGFyeVRyaWdnZXJFbHQiLCJwYXJlbnRFbHRJbkhpZXJhcmNoeSIsInBhcmFtcyIsInBhdGhGcm9tSGVhZGVycyIsInR5cGVGcm9tSGVhZGVycyIsInJlcXVlc3RQYXRoIiwicmVzcG9uc2VQYXRoIiwicHVzaFVybCIsInJlcGxhY2VVcmwiLCJlbGVtZW50SXNCb29zdGVkIiwic2F2ZVR5cGUiLCJyZXNwb25zZUhhbmRsaW5nQ29uZmlnIiwic3RhdHVzIiwicmVnRXhwIiwicmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQiLCJ0aXRsZUVsdCIsInJlc3BvbnNlSW5mb1NlbGVjdCIsInJlZGlyZWN0UGF0aCIsInJlZGlyZWN0U3dhcFNwZWMiLCJzaG91bGRSZWZyZXNoIiwiaGlzdG9yeVVwZGF0ZSIsInJlc3BvbnNlSGFuZGxpbmciLCJzaG91bGRTd2FwIiwiaXNFcnJvciIsImlnbm9yZVRpdGxlIiwic2VsZWN0T3ZlcnJpZGUiLCJzd2FwT3ZlcnJpZGUiLCJzZXJ2ZXJSZXNwb25zZSIsInNldHRsZVJlc29sdmUiLCJzZXR0bGVSZWplY3QiLCJzZWxlY3RPT0IiLCJkb1N3YXAiLCJmaW5hbEVsdCIsInNob3VsZFRyYW5zaXRpb24iLCJzZXR0bGVQcm9taXNlIiwiaW5uZXJEb1N3YXAiLCJhcGkiLCJ0ZXh0IiwicGFyYW1ldGVycyIsImV4dGVuc2lvbnNUb1JldHVybiIsImV4dGVuc2lvbnNUb0lnbm9yZSIsImV4dGVuc2lvbnNGb3JFbGVtZW50IiwiZXh0ZW5zaW9uTmFtZSIsImZuIiwibm9uY2VBdHRyaWJ1dGUiLCJtZXRhQ29uZmlnIiwiYm9keSIsInJlc3RvcmVkRWx0cyIsIm9yaWdpbmFsUG9wc3RhdGUiLCJodG14X2VzbV9kZWZhdWx0IiwiZGVwZW5kc09uIiwicGF0aFNwZWMiLCJkZXBlbmRlbmN5UGF0aCIsInVybFBhdGgiLCJkZXBlbmRlbmN5RWxlbWVudCIsInBhdGhFbGVtZW50IiwicmVmcmVzaFBhdGgiLCJlbHRzV2l0aERlcHMiLCJjb25maWciLCJrZWJhYkV2ZW50TmFtZSIsIm1ha2VFdmVudCIsInRyaWdnZXJDaGlsZHJlbiIsInRyaWdnZXJlZCIsIm5ld0V2ZW50IiwiYXR0clByZWZpeCIsInN0YXJ0c1dpdGgiLCJnZXRSZXNwQ29kZVRhcmdldCIsInJlc3BDb2RlTnVtYmVyIiwicmVzcENvZGUiLCJhdHRyUG9zc2liaWxpdGllcyIsImF0dHJWYWx1ZSIsImhhbmRsZUVycm9yRmxhZyIsImFwaVJlZiIsImxhc3RWZXJzaW9uIiwiZW5hYmxlZCIsImV2ZW50U291cmNlIiwibWVzc2FnZSIsInJlbG9hZCIsImV2YWxGdW5jUmVnZXgiLCJyZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyIsIm1hdGNoZXMiLCJlbGUiLCJzcGxpdE9uV2hpdGVzcGFjZSIsImdldExlZ2FjeVdlYnNvY2tldFVSTCIsImxlZ2FjeVNTRVZhbHVlIiwiZW5zdXJlV2ViU29ja2V0Iiwic29ja2V0RWx0Iiwid3NzU291cmNlIiwibGVnYWN5U291cmNlIiwiYmFzZV9wYXJ0Iiwic29ja2V0V3JhcHBlciIsImNyZWF0ZVdlYnNvY2tldFdyYXBwZXIiLCJjcmVhdGVXZWJTb2NrZXQiLCJtYXliZUNsb3NlV2ViU29ja2V0U291cmNlIiwiY2hpbGRyZW4iLCJzb2NrZXRGdW5jIiwid3JhcHBlciIsInNlbmRFbHQiLCJxdWV1ZWRJdGVtIiwic29ja2V0IiwiZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkiLCJldmVudHMiLCJrIiwiZW5zdXJlV2ViU29ja2V0U2VuZCIsImxlZ2FjeUF0dHJpYnV0ZSIsIndlYlNvY2tldFBhcmVudCIsImhhc1dlYlNvY2tldCIsInByb2Nlc3NXZWJTb2NrZXRTZW5kIiwidHMiLCJyYXdQYXJhbWV0ZXJzIiwiYWxsUGFyYW1ldGVycyIsInNlbmRDb25maWciLCJ0b1NlbmQiLCJyZXRyeUNvdW50IiwiZXhwIiwic29jayIsInF1ZXJ5QXR0cmlidXRlT25UaGlzT3JDaGlsZHJlbiIsImZvckVhY2giLCJ3YXRjaFVybCIsImxhc3RVcmwiLCJfIiwibmV3VXJsIiwib25VcmxDaGFuZ2UiLCJoYXNNYXRjaCIsImRlZmF1bHRLZXkiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLEVBQUFBLENBQVEsVUFBVyxDQUlyQixJQUFNLElBQU8sQ0FBQSxDQUlYLE9BQVEsSUFFUixDQUFBLE9BQUEsQ0FBUyxLQUVULEVBQUksQ0FBQSxJQUFBLENBRUosSUFBSyxJQUVMLENBQUEsT0FBQSxDQUFTLEtBRVQsSUFBTSxDQUFBLElBQUEsQ0FHTixJQUFNLENBQUEsSUFBQSxDQUVOLE9BQVMsQ0FBQSxJQUFBLENBRVQsUUFBUyxJQVVULENBQUEsTUFBQSxDQUFRLFNBQVNDLENBQUtDLENBQUFBLENBQUFBLENBQU0sQ0FFMUIsT0FEb0IsY0FBQSxDQUFlRCxDQUFLQyxDQUFBQSxDQUFBQSxFQUFRLE1BQU0sQ0FBQSxDQUNuQyxNQUNyQixDQUdBLENBQUEsTUFBQSxDQUFRLEtBRVIsUUFBVSxDQUFBLElBQUEsQ0FFVixZQUFhLElBRWIsQ0FBQSxXQUFBLENBQWEsSUFFYixDQUFBLFNBQUEsQ0FBVyxJQUVYLENBQUEsSUFBQSxDQUFNLEtBR04sZUFBaUIsQ0FBQSxJQUFBLENBRWpCLGdCQUFpQixJQUdqQixDQUFBLE1BQUEsQ0FBUSxLQUVSLE9BQVMsQ0FBQSxJQUFBLENBT1QsTUFBUSxDQUFBLElBQUEsQ0FRUixNQUFRLENBQUEsQ0FNTixlQUFnQixDQU1oQixDQUFBLENBQUEsZ0JBQUEsQ0FBa0IsR0FLbEIsb0JBQXNCLENBQUEsQ0FBQSxDQUFBLENBTXRCLGlCQUFrQixXQU1sQixDQUFBLGdCQUFBLENBQWtCLENBTWxCLENBQUEsa0JBQUEsQ0FBb0IsRUFNcEIsQ0FBQSxzQkFBQSxDQUF3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QUFxQixDQUFBLENBQ2xEdVgsR0FDRjNFLENBQUssQ0FBQSxJQUFBLENBQ0g1UyxFQUNBQSxDQUFHLENBQUEsWUFBQSxDQUFhLHNCQUF5QnVYLENBQUFBLENBQVUsQ0FBSyxFQUFBLEVBQUEsQ0FDeEQsQ0FBRSxTQUFXLENBQUEsV0FBQSxDQUFhLFVBQVcsQ0FBRyxDQUFBLFdBQUEsQ0FBYSxDQUFFLENBQ3pELEVBRUosQ0FDRixDQUFDLEVBQ0giLCJmaWxlIjoiaHRtZ28uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaHRteCA9IChmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnXG5cbiAgLy8gUHVibGljIEFQSVxuICBjb25zdCBodG14ID0ge1xuICAgIC8vIFRzYyBtYWRuZXNzIGhlcmUsIGFzc2lnbmluZyB0aGUgZnVuY3Rpb25zIGRpcmVjdGx5IHJlc3VsdHMgaW4gYW4gaW52YWxpZCBUeXBlU2NyaXB0IG91dHB1dCwgYnV0IHJlYXNzaWduaW5nIGlzIGZpbmVcbiAgICAvKiBFdmVudCBwcm9jZXNzaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygb25Mb2FkSGVscGVyfSAqL1xuICAgIG9uTG9hZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwcm9jZXNzTm9kZX0gKi9cbiAgICBwcm9jZXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZEV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9mZjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0cmlnZ2VyRXZlbnR9ICovXG4gICAgdHJpZ2dlcjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhamF4SGVscGVyfSAqL1xuICAgIGFqYXg6IG51bGwsXG4gICAgLyogRE9NIHF1ZXJ5aW5nIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kfSAqL1xuICAgIGZpbmQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZEFsbH0gKi9cbiAgICBmaW5kQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGNsb3Nlc3R9ICovXG4gICAgY2xvc2VzdDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbnB1dCB2YWx1ZXMgdGhhdCB3b3VsZCByZXNvbHZlIGZvciBhIGdpdmVuIGVsZW1lbnQgdmlhIHRoZSBodG14IHZhbHVlIHJlc29sdXRpb24gbWVjaGFuaXNtXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN2YWx1ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0IHRoZSBlbGVtZW50IHRvIHJlc29sdmUgdmFsdWVzIG9uXG4gICAgICogQHBhcmFtIHtIdHRwVmVyYn0gdHlwZSB0aGUgcmVxdWVzdCB0eXBlIChlLmcuICoqZ2V0Kiogb3IgKipwb3N0KiopIG5vbi1HRVQncyB3aWxsIGluY2x1ZGUgdGhlIGVuY2xvc2luZyBmb3JtIG9mIHRoZSBlbGVtZW50LiBEZWZhdWx0cyB0byAqKnBvc3QqKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgdmFsdWVzOiBmdW5jdGlvbihlbHQsIHR5cGUpIHtcbiAgICAgIGNvbnN0IGlucHV0VmFsdWVzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB0eXBlIHx8ICdwb3N0JylcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlcy52YWx1ZXNcbiAgICB9LFxuICAgIC8qIERPTSBtYW5pcHVsYXRpb24gaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZENsYXNzVG9FbGVtZW50fSAqL1xuICAgIGFkZENsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdG9nZ2xlQ2xhc3NPbkVsZW1lbnR9ICovXG4gICAgdG9nZ2xlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdGFrZUNsYXNzRm9yRWxlbWVudH0gKi9cbiAgICB0YWtlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygc3dhcH0gKi9cbiAgICBzd2FwOiBudWxsLFxuICAgIC8qIEV4dGVuc2lvbiBlbnRyeXBvaW50cyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGRlZmluZUV4dGVuc2lvbn0gKi9cbiAgICBkZWZpbmVFeHRlbnNpb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXh0ZW5zaW9ufSAqL1xuICAgIHJlbW92ZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dBbGx9ICovXG4gICAgbG9nQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ05vbmV9ICovXG4gICAgbG9nTm9uZTogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKipcbiAgICAgKiBUaGUgbG9nZ2VyIGh0bXggdXNlcyB0byBsb2cgd2l0aFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nZ2VyXG4gICAgICovXG4gICAgbG9nZ2VyOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHkgaG9sZGluZyB0aGUgY29uZmlndXJhdGlvbiBodG14IHVzZXMgYXQgcnVudGltZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB1c2luZyBhIFttZXRhIHRhZ10oaHR0cHM6Ly9odG14Lm9yZy9kb2NzLyNjb25maWcpIGlzIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHRoZXNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjb25maWdcbiAgICAgKi9cbiAgICBjb25maWc6IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byB1c2UgaGlzdG9yeS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUVuYWJsZWQ6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8ga2VlcCBpbiAqKmxvY2FsU3RvcmFnZSoqIGZvciBoaXN0b3J5IHN1cHBvcnQuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlDYWNoZVNpemU6IDEwLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICByZWZyZXNoT25IaXN0b3J5TWlzczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IHN3YXAgc3R5bGUgdG8gdXNlIGlmICoqW2h4LXN3YXBdKGh0dHBzOi8vaHRteC5vcmcvYXR0cmlidXRlcy9oeC1zd2FwKSoqIGlzIG9taXR0ZWQuXG4gICAgICAgKiBAdHlwZSBIdG14U3dhcFN0eWxlXG4gICAgICAgKiBAZGVmYXVsdCAnaW5uZXJIVE1MJ1xuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcFN0eWxlOiAnaW5uZXJIVE1MJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiByZWNlaXZpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGRvaW5nIHRoZSBzd2FwLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwRGVsYXk6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gY29tcGxldGluZyB0aGUgY29udGVudCBzd2FwIGFuZCBzZXR0bGluZyBhdHRyaWJ1dGVzLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U2V0dGxlRGVsYXk6IDIwLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0cnVlLCBodG14IHdpbGwgaW5qZWN0IGEgc21hbGwgYW1vdW50IG9mIENTUyBpbnRvIHRoZSBwYWdlIHRvIG1ha2UgaW5kaWNhdG9ycyBpbnZpc2libGUgdW5sZXNzIHRoZSAqKmh0bXgtaW5kaWNhdG9yKiogY2xhc3MgaXMgcHJlc2VudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaW5jbHVkZUluZGljYXRvclN0eWxlczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIGluZGljYXRvcnMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1pbmRpY2F0b3InXG4gICAgICAgKi9cbiAgICAgIGluZGljYXRvckNsYXNzOiAnaHRteC1pbmRpY2F0b3InLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdHJpZ2dlcmluZyBlbGVtZW50cyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXJlcXVlc3QnXG4gICAgICAgKi9cbiAgICAgIHJlcXVlc3RDbGFzczogJ2h0bXgtcmVxdWVzdCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byB0ZW1wb3JhcmlseSBwbGFjZSBvbiBlbGVtZW50cyB0aGF0IGh0bXggaGFzIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWFkZGVkJ1xuICAgICAgICovXG4gICAgICBhZGRlZENsYXNzOiAnaHRteC1hZGRlZCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc2V0dGxpbmcnXG4gICAgICAgKi9cbiAgICAgIHNldHRsaW5nQ2xhc3M6ICdodG14LXNldHRsaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHN3YXBwaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zd2FwcGluZydcbiAgICAgICAqL1xuICAgICAgc3dhcHBpbmdDbGFzczogJ2h0bXgtc3dhcHBpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvd3MgdGhlIHVzZSBvZiBldmFsLWxpa2UgZnVuY3Rpb25hbGl0eSBpbiBodG14LCB0byBlbmFibGUgKipoeC12YXJzKiosIHRyaWdnZXIgY29uZGl0aW9ucyAmIHNjcmlwdCB0YWcgZXZhbHVhdGlvbi4gQ2FuIGJlIHNldCB0byAqKmZhbHNlKiogZm9yIENTUCBjb21wYXRpYmlsaXR5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd0V2YWw6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byBmYWxzZSwgZGlzYWJsZXMgdGhlIGludGVycHJldGF0aW9uIG9mIHNjcmlwdCB0YWdzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd1NjcmlwdFRhZ3M6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHNjcmlwdHMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVNjcmlwdE5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc3R5bGVzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTdHlsZU5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGF0dHJpYnV0ZXMgdG8gc2V0dGxlIGR1cmluZyB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgICAgICogQGRlZmF1bHQgWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXVxuICAgICAgICovXG4gICAgICBhdHRyaWJ1dGVzVG9TZXR0bGU6IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93IGNyb3NzLXNpdGUgQWNjZXNzLUNvbnRyb2wgcmVxdWVzdHMgdXNpbmcgY3JlZGVudGlhbHMgc3VjaCBhcyBjb29raWVzLCBhdXRob3JpemF0aW9uIGhlYWRlcnMgb3IgVExTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgdGltZW91dDogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgKipnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheSoqIGZvciByZWNvbm5lY3RpbmcgYWZ0ZXIgdW5leHBlY3RlZCBjb25uZWN0aW9uIGxvc3MgYnkgdGhlIGV2ZW50IGNvZGUgKipBYm5vcm1hbCBDbG9zdXJlKiosICoqU2VydmljZSBSZXN0YXJ0Kiogb3IgKipUcnkgQWdhaW4gTGF0ZXIqKi5cbiAgICAgICAqIEB0eXBlIHsnZnVsbC1qaXR0ZXInIHwgKChyZXRyeUNvdW50Om51bWJlcikgPT4gbnVtYmVyKX1cbiAgICAgICAqIEBkZWZhdWx0IFwiZnVsbC1qaXR0ZXJcIlxuICAgICAgICovXG4gICAgICB3c1JlY29ubmVjdERlbGF5OiAnZnVsbC1qaXR0ZXInLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdHlwZSBvZiBiaW5hcnkgZGF0YSBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICogQHR5cGUgQmluYXJ5VHlwZVxuICAgICAgICogQGRlZmF1bHQgJ2Jsb2InXG4gICAgICAgKi9cbiAgICAgIHdzQmluYXJ5VHlwZTogJ2Jsb2InLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJ1xuICAgICAgICovXG4gICAgICBkaXNhYmxlU2VsZWN0b3I6ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgeydhdXRvJyB8ICdpbnN0YW50JyB8ICdzbW9vdGgnfVxuICAgICAgICogQGRlZmF1bHQgJ2luc3RhbnQnXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoZSBmb2N1c2VkIGVsZW1lbnQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdmlldy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRGb2N1c1Njcm9sbDogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBpbmNsdWRlIGEgY2FjaGUtYnVzdGluZyBwYXJhbWV0ZXIgaW4gR0VUIHJlcXVlc3RzIHRvIGF2b2lkIGNhY2hpbmcgcGFydGlhbCByZXNwb25zZXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdldENhY2hlQnVzdGVyUGFyYW06IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgaHRteCB3aWxsIHVzZSB0aGUgVmlldyBUcmFuc2l0aW9uIEFQSSB3aGVuIHN3YXBwaW5nIGluIG5ldyBjb250ZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2xvYmFsVmlld1RyYW5zaXRpb25zOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogaHRteCB3aWxsIGZvcm1hdCByZXF1ZXN0cyB3aXRoIHRoZXNlIG1ldGhvZHMgYnkgZW5jb2RpbmcgdGhlaXIgcGFyYW1ldGVycyBpbiB0aGUgVVJMLCBub3QgdGhlIHJlcXVlc3QgYm9keVxuICAgICAgICogQHR5cGUgeyhIdHRwVmVyYilbXX1cbiAgICAgICAqIEBkZWZhdWx0IFsnZ2V0JywgJ2RlbGV0ZSddXG4gICAgICAgKi9cbiAgICAgIG1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zOiBbJ2dldCcsICdkZWxldGUnXSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGRpc2FibGVzIGh0bXgtYmFzZWQgcmVxdWVzdHMgdG8gbm9uLW9yaWdpbiBob3N0cy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHNlbGZSZXF1ZXN0c09ubHk6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBub3QgdXBkYXRlIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQgd2hlbiBhIHRpdGxlIHRhZyBpcyBmb3VuZCBpbiBuZXcgY29udGVudFxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgaWdub3JlVGl0bGU6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgb2YgYSBib29zdGVkIGVsZW1lbnQgaXMgc2Nyb2xsZWQgaW50byB0aGUgdmlld3BvcnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEludG9WaWV3T25Cb29zdDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNhY2hlIHRvIHN0b3JlIGV2YWx1YXRlZCB0cmlnZ2VyIHNwZWNpZmljYXRpb25zIGludG8uXG4gICAgICAgKiBZb3UgbWF5IGRlZmluZSBhIHNpbXBsZSBvYmplY3QgdG8gdXNlIGEgbmV2ZXItY2xlYXJpbmcgY2FjaGUsIG9yIGltcGxlbWVudCB5b3VyIG93biBzeXN0ZW0gdXNpbmcgYSBbcHJveHkgb2JqZWN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSlcbiAgICAgICAqIEB0eXBlIHtPYmplY3R8bnVsbH1cbiAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAqL1xuICAgICAgdHJpZ2dlclNwZWNzQ2FjaGU6IG51bGwsXG4gICAgICAvKiogQHR5cGUgYm9vbGVhbiAqL1xuICAgICAgZGlzYWJsZUluaGVyaXRhbmNlOiBmYWxzZSxcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1tdICovXG4gICAgICByZXNwb25zZUhhbmRsaW5nOiBbXG4gICAgICAgIHsgY29kZTogJzIwNCcsIHN3YXA6IGZhbHNlIH0sXG4gICAgICAgIHsgY29kZTogJ1syM10uLicsIHN3YXA6IHRydWUgfSxcbiAgICAgICAgeyBjb2RlOiAnWzQ1XS4uJywgc3dhcDogZmFsc2UsIGVycm9yOiB0cnVlIH1cbiAgICAgIF0sXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gcHJvY2VzcyBPT0Igc3dhcHMgb24gZWxlbWVudHMgdGhhdCBhcmUgbmVzdGVkIHdpdGhpbiB0aGUgbWFpbiByZXNwb25zZSBlbGVtZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd05lc3RlZE9vYlN3YXBzOiB0cnVlXG4gICAgfSxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwYXJzZUludGVydmFsfSAqL1xuICAgIHBhcnNlSW50ZXJ2YWw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgaW50ZXJuYWxFdmFsfSAqL1xuICAgIF86IG51bGwsXG4gICAgdmVyc2lvbjogJzIuMC4yJ1xuICB9XG4gIC8vIFRzYyBtYWRuZXNzIHBhcnQgMlxuICBodG14Lm9uTG9hZCA9IG9uTG9hZEhlbHBlclxuICBodG14LnByb2Nlc3MgPSBwcm9jZXNzTm9kZVxuICBodG14Lm9uID0gYWRkRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC5vZmYgPSByZW1vdmVFdmVudExpc3RlbmVySW1wbFxuICBodG14LnRyaWdnZXIgPSB0cmlnZ2VyRXZlbnRcbiAgaHRteC5hamF4ID0gYWpheEhlbHBlclxuICBodG14LmZpbmQgPSBmaW5kXG4gIGh0bXguZmluZEFsbCA9IGZpbmRBbGxcbiAgaHRteC5jbG9zZXN0ID0gY2xvc2VzdFxuICBodG14LnJlbW92ZSA9IHJlbW92ZUVsZW1lbnRcbiAgaHRteC5hZGRDbGFzcyA9IGFkZENsYXNzVG9FbGVtZW50XG4gIGh0bXgucmVtb3ZlQ2xhc3MgPSByZW1vdmVDbGFzc0Zyb21FbGVtZW50XG4gIGh0bXgudG9nZ2xlQ2xhc3MgPSB0b2dnbGVDbGFzc09uRWxlbWVudFxuICBodG14LnRha2VDbGFzcyA9IHRha2VDbGFzc0ZvckVsZW1lbnRcbiAgaHRteC5zd2FwID0gc3dhcFxuICBodG14LmRlZmluZUV4dGVuc2lvbiA9IGRlZmluZUV4dGVuc2lvblxuICBodG14LnJlbW92ZUV4dGVuc2lvbiA9IHJlbW92ZUV4dGVuc2lvblxuICBodG14LmxvZ0FsbCA9IGxvZ0FsbFxuICBodG14LmxvZ05vbmUgPSBsb2dOb25lXG4gIGh0bXgucGFyc2VJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWxcbiAgaHRteC5fID0gaW50ZXJuYWxFdmFsXG5cbiAgY29uc3QgaW50ZXJuYWxBUEkgPSB7XG4gICAgYWRkVHJpZ2dlckhhbmRsZXIsXG4gICAgYm9keUNvbnRhaW5zLFxuICAgIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSxcbiAgICBmaW5kVGhpc0VsZW1lbnQsXG4gICAgZmlsdGVyVmFsdWVzLFxuICAgIHN3YXAsXG4gICAgaGFzQXR0cmlidXRlLFxuICAgIGdldEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0TWF0Y2gsXG4gICAgZ2V0RXhwcmVzc2lvblZhcnMsXG4gICAgZ2V0SGVhZGVycyxcbiAgICBnZXRJbnB1dFZhbHVlcyxcbiAgICBnZXRJbnRlcm5hbERhdGEsXG4gICAgZ2V0U3dhcFNwZWNpZmljYXRpb24sXG4gICAgZ2V0VHJpZ2dlclNwZWNzLFxuICAgIGdldFRhcmdldCxcbiAgICBtYWtlRnJhZ21lbnQsXG4gICAgbWVyZ2VPYmplY3RzLFxuICAgIG1ha2VTZXR0bGVJbmZvLFxuICAgIG9vYlN3YXAsXG4gICAgcXVlcnlTZWxlY3RvckV4dCxcbiAgICBzZXR0bGVJbW1lZGlhdGVseSxcbiAgICBzaG91bGRDYW5jZWwsXG4gICAgdHJpZ2dlckV2ZW50LFxuICAgIHRyaWdnZXJFcnJvckV2ZW50LFxuICAgIHdpdGhFeHRlbnNpb25zXG4gIH1cblxuICBjb25zdCBWRVJCUyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCddXG4gIGNvbnN0IFZFUkJfU0VMRUNUT1IgPSBWRVJCUy5tYXAoZnVuY3Rpb24odmVyYikge1xuICAgIHJldHVybiAnW2h4LScgKyB2ZXJiICsgJ10sIFtkYXRhLWh4LScgKyB2ZXJiICsgJ10nXG4gIH0pLmpvaW4oJywgJylcblxuICBjb25zdCBIRUFEX1RBR19SRUdFWCA9IG1ha2VUYWdSZWdFeCgnaGVhZCcpXG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXRpbGl0aWVzXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge1JlZ0V4cH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VUYWdSZWdFeCh0YWcsIGdsb2JhbCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYDwke3RhZ30oXFxcXHNbXj5dKj58PikoW1xcXFxzXFxcXFNdKj8pPFxcXFwvJHt0YWd9PmAsXG4gICAgICBnbG9iYWwgPyAnZ2ltJyA6ICdpbScpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIGludGVydmFsIHN0cmluZyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBodG14IGRvZXMuIFVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IGhhdmUgdGltaW5nLXJlbGF0ZWQgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQ2F1dGlvbjogQWNjZXB0cyBhbiBpbnQgZm9sbG93ZWQgYnkgZWl0aGVyICoqcyoqIG9yICoqbXMqKi4gQWxsIG90aGVyIHZhbHVlcyB1c2UgKipwYXJzZUZsb2F0KipcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcGFyc2VJbnRlcnZhbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRpbWluZyBzdHJpbmdcbiAgICogQHJldHVybnMge251bWJlcnx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUludGVydmFsKHN0cikge1xuICAgIGlmIChzdHIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgbGV0IGludGVydmFsID0gTmFOXG4gICAgaWYgKHN0ci5zbGljZSgtMikgPT0gJ21zJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMikpXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdzJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMFxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAnbScpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDAgKiA2MFxuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNOYU4oaW50ZXJ2YWwpID8gdW5kZWZpbmVkIDogaW50ZXJ2YWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmF3QXR0cmlidXRlKGVsdCwgbmFtZSkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGVsdC5nZXRBdHRyaWJ1dGUobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIC8vIHJlc29sdmUgd2l0aCBib3RoIGh4IGFuZCBkYXRhLWh4IHByZWZpeGVzXG4gIGZ1bmN0aW9uIGhhc0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gISFlbHQuaGFzQXR0cmlidXRlICYmIChlbHQuaGFzQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpIHx8XG4gICAgICBlbHQuaGFzQXR0cmlidXRlKCdkYXRhLScgKyBxdWFsaWZpZWROYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuIGdldFJhd0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHx8IGdldFJhd0F0dHJpYnV0ZShlbHQsICdkYXRhLScgKyBxdWFsaWZpZWROYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudEVsdChlbHQpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIGlmICghcGFyZW50ICYmIGVsdC5wYXJlbnROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkgcmV0dXJuIGVsdC5wYXJlbnROb2RlXG4gICAgcmV0dXJuIHBhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICAgIHJldHVybiBkb2N1bWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtOb2RlfERvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Um9vdE5vZGUoZWx0LCBnbG9iYWwpIHtcbiAgICByZXR1cm4gZWx0LmdldFJvb3ROb2RlID8gZWx0LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IGdsb2JhbCB9KSA6IGdldERvY3VtZW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0geyhlOk5vZGUpID0+IGJvb2xlYW59IGNvbmRpdGlvblxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0TWF0Y2goZWx0LCBjb25kaXRpb24pIHtcbiAgICB3aGlsZSAoZWx0ICYmICFjb25kaXRpb24oZWx0KSkge1xuICAgICAgZWx0ID0gcGFyZW50RWx0KGVsdClcbiAgICB9XG5cbiAgICByZXR1cm4gZWx0IHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGluaXRpYWxFbGVtZW50XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gYW5jZXN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoaW5pdGlhbEVsZW1lbnQsIGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBkaXNpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1kaXNpbmhlcml0JylcbiAgICB2YXIgaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtaW5oZXJpdCcpXG4gICAgaWYgKGluaXRpYWxFbGVtZW50ICE9PSBhbmNlc3Rvcikge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmRpc2FibGVJbmhlcml0YW5jZSkge1xuICAgICAgICBpZiAoaW5oZXJpdCAmJiAoaW5oZXJpdCA9PT0gJyonIHx8IGluaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpc2luaGVyaXQgJiYgKGRpc2luaGVyaXQgPT09ICcqJyB8fCBkaXNpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICByZXR1cm4gJ3Vuc2V0J1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBsZXQgY2xvc2VzdEF0dHIgPSBudWxsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuICEhKGNsb3Nlc3RBdHRyID0gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoZWx0LCBhc0VsZW1lbnQoZSksIGF0dHJpYnV0ZU5hbWUpKVxuICAgIH0pXG4gICAgaWYgKGNsb3Nlc3RBdHRyICE9PSAndW5zZXQnKSB7XG4gICAgICByZXR1cm4gY2xvc2VzdEF0dHJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMgZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRWYXJpYWJsZVxuICAgIGNvbnN0IG1hdGNoZXNGdW5jdGlvbiA9IGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgKGVsdC5tYXRjaGVzIHx8IGVsdC5tYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWx0LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbHQub01hdGNoZXNTZWxlY3RvcilcbiAgICByZXR1cm4gISFtYXRjaGVzRnVuY3Rpb24gJiYgbWF0Y2hlc0Z1bmN0aW9uLmNhbGwoZWx0LCBzZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdGFydFRhZyhzdHIpIHtcbiAgICBjb25zdCB0YWdNYXRjaGVyID0gLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pXG4gICAgY29uc3QgbWF0Y2ggPSB0YWdNYXRjaGVyLmV4ZWMoc3RyKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSFRNTChyZXNwKSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpXG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcCwgJ3RleHQvaHRtbCcpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBlbHQpIHtcbiAgICB3aGlsZSAoZWx0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsdC5jaGlsZE5vZGVzWzBdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge0hUTUxTY3JpcHRFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZHVwbGljYXRlU2NyaXB0KHNjcmlwdCkge1xuICAgIGNvbnN0IG5ld1NjcmlwdCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICBmb3JFYWNoKHNjcmlwdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBuZXdTY3JpcHQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICB9KVxuICAgIG5ld1NjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdC50ZXh0Q29udGVudFxuICAgIG5ld1NjcmlwdC5hc3luYyA9IGZhbHNlXG4gICAgaWYgKGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlKSB7XG4gICAgICBuZXdTY3JpcHQubm9uY2UgPSBodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZVxuICAgIH1cbiAgICByZXR1cm4gbmV3U2NyaXB0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpIHtcbiAgICByZXR1cm4gc2NyaXB0Lm1hdGNoZXMoJ3NjcmlwdCcpICYmIChzY3JpcHQudHlwZSA9PT0gJ3RleHQvamF2YXNjcmlwdCcgfHwgc2NyaXB0LnR5cGUgPT09ICdtb2R1bGUnIHx8IHNjcmlwdC50eXBlID09PSAnJylcbiAgfVxuXG4gIC8qKlxuICAgKiB3ZSBoYXZlIHRvIG1ha2UgbmV3IGNvcGllcyBvZiBzY3JpcHQgdGFncyB0aGF0IHdlIGFyZSBnb2luZyB0byBpbnNlcnQgYmVjYXVzZVxuICAgKiBTT01FIGJyb3dzZXJzIChub3Qgc2F5aW5nIHdobywgYnV0IGl0IGludm9sdmVzIGFuIGVsZW1lbnQgYW5kIGFuIGFuaW1hbCkgZG9uJ3RcbiAgICogZXhlY3V0ZSBzY3JpcHRzIGNyZWF0ZWQgaW4gPHRlbXBsYXRlPiB0YWdzIHdoZW4gdGhleSBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXG4gICAqIGFuZCBhbGwgdGhlIG90aGVycyBkbyBsbWFvXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpIHtcbiAgICBBcnJheS5mcm9tKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpKS5mb3JFYWNoKC8qKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHQgKi8gKHNjcmlwdCkgPT4ge1xuICAgICAgaWYgKGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSkge1xuICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBzY3JpcHQucGFyZW50Tm9kZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3U2NyaXB0LCBzY3JpcHQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7RG9jdW1lbnRGcmFnbWVudCAmIHt0aXRsZT86IHN0cmluZ319IERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGVcbiAgICogQGRlc2NyaXB0aW9uICBhIGRvY3VtZW50IGZyYWdtZW50IHJlcHJlc2VudGluZyB0aGUgcmVzcG9uc2UgSFRNTCwgaW5jbHVkaW5nXG4gICAqIGEgYHRpdGxlYCBwcm9wZXJ0eSBmb3IgYW55IHRpdGxlIGluZm9ybWF0aW9uIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2UgSFRNTFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VGcmFnbWVudChyZXNwb25zZSkge1xuICAgIC8vIHN0cmlwIGhlYWQgdGFnIHRvIGRldGVybWluZSBzaGFwZSBvZiByZXNwb25zZSB3ZSBhcmUgZGVhbGluZyB3aXRoXG4gICAgY29uc3QgcmVzcG9uc2VXaXRoTm9IZWFkID0gcmVzcG9uc2UucmVwbGFjZShIRUFEX1RBR19SRUdFWCwgJycpXG4gICAgY29uc3Qgc3RhcnRUYWcgPSBnZXRTdGFydFRhZyhyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi9cbiAgICBsZXQgZnJhZ21lbnRcbiAgICBpZiAoc3RhcnRUYWcgPT09ICdodG1sJykge1xuICAgICAgLy8gaWYgaXQgaXMgYSBmdWxsIGRvY3VtZW50LCBwYXJzZSBpdCBhbmQgcmV0dXJuIHRoZSBib2R5XG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIGlmIChzdGFydFRhZyA9PT0gJ2JvZHknKSB7XG4gICAgICAvLyBwYXJzZSBib2R5IHcvbyB3cmFwcGluZyBpbiB0ZW1wbGF0ZVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgbm9uLWJvZHkgcGFydGlhbCBIVE1MIGNvbnRlbnQsIHNvIHdyYXAgaXQgaW4gYSB0ZW1wbGF0ZSB0byBtYXhpbWl6ZSBwYXJzaW5nIGZsZXhpYmlsaXR5XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwoJzxib2R5Pjx0ZW1wbGF0ZSBjbGFzcz1cImludGVybmFsLWh0bXgtd3JhcHBlclwiPicgKyByZXNwb25zZVdpdGhOb0hlYWQgKyAnPC90ZW1wbGF0ZT48L2JvZHk+JylcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKGRvYy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpLmNvbnRlbnQpXG4gICAgICAvLyBleHRyYWN0IHRpdGxlIGludG8gZnJhZ21lbnQgZm9yIGxhdGVyIHByb2Nlc3NpbmdcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG5cbiAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyB3ZSBzdXBwb3J0IGEgdGl0bGUgdGFnIGF0IHRoZSByb290IGxldmVsIG9mIG5vbi1ib2R5IHJlc3BvbnNlcywgc28gd2UgbmVlZCB0byBoYW5kbGUgaXRcbiAgICAgIHZhciB0aXRsZUVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbGVtZW50ICYmIHRpdGxlRWxlbWVudC5wYXJlbnROb2RlID09PSBmcmFnbWVudCkge1xuICAgICAgICB0aXRsZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgICAgZnJhZ21lbnQudGl0bGUgPSB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93U2NyaXB0VGFncykge1xuICAgICAgICBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBzY3JpcHQgdGFncyBpZiBzY3JpcHRzIGFyZSBkaXNhYmxlZFxuICAgICAgICBmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKS5mb3JFYWNoKChzY3JpcHQpID0+IHNjcmlwdC5yZW1vdmUoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVDYWxsKGZ1bmMpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgZnVuYygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBpc1R5cGUobywgdHlwZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIEZ1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIE9iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUmF3T2JqZWN0KG8pIHtcbiAgICByZXR1cm4gaXNUeXBlKG8sICdPYmplY3QnKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9uSGFuZGxlclxuICAgKiBAcHJvcGVydHkgeyhrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwKXxzdHJpbmd9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RlbmVySW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IG9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14Tm9kZUludGVybmFsRGF0YVxuICAgKiBFbGVtZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbml0SGFzaF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYm9vc3RlZF1cbiAgICogQHByb3BlcnR5IHtPbkhhbmRsZXJbXX0gW29uSGFuZGxlcnNdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHByb3BlcnR5IHtMaXN0ZW5lckluZm9bXX0gW2xpc3RlbmVySW5mb3NdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhbmNlbGxlZF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdHJpZ2dlcmVkT25jZV1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheWVkXVxuICAgKiBAcHJvcGVydHkge251bWJlcnxudWxsfSBbdGhyb3R0bGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFzdFZhbHVlXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2FkZWRdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJiXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwb2xsaW5nXVxuICAgKiBAcHJvcGVydHkge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8bnVsbH0gW2xhc3RCdXR0b25DbGlja2VkXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3JlcXVlc3RDb3VudF1cbiAgICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0gW3hocl1cbiAgICogQHByb3BlcnR5IHsoKCkgPT4gdm9pZClbXX0gW3F1ZXVlZFJlcXVlc3RzXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthYm9ydGFibGVdXG4gICAqXG4gICAqIEV2ZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IFt0cmlnZ2VyU3BlY11cbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldFtdfSBbaGFuZGxlZEZvcl1cbiAgICovXG5cbiAgLyoqXG4gICAqIGdldEludGVybmFsRGF0YSByZXRyaWV2ZXMgXCJwcml2YXRlXCIgZGF0YSBzdG9yZWQgYnkgaHRteCB3aXRoaW4gYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEV2ZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxEYXRhKGVsdCkge1xuICAgIGNvbnN0IGRhdGFQcm9wID0gJ2h0bXgtaW50ZXJuYWwtZGF0YSdcbiAgICBsZXQgZGF0YSA9IGVsdFtkYXRhUHJvcF1cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGRhdGEgPSBlbHRbZGF0YVByb3BdID0ge31cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0FycmF5IGNvbnZlcnRzIGFuIEFycmF5TGlrZSBvYmplY3QgaW50byBhIHJlYWwgYXJyYXkuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHJldHVybnMge1RbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkoYXJyKSB7XG4gICAgY29uc3QgcmV0dXJuQXJyID0gW11cbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXR1cm5BcnIucHVzaChhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5BcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1RbXXxOYW1lZE5vZGVNYXB8SFRNTENvbGxlY3Rpb258SFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb258QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHBhcmFtIHsoVCkgPT4gdm9pZH0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gZm9yRWFjaChhcnIsIGZ1bmMpIHtcbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBmdW5jKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsZWRJbnRvVmlldyhlbCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGVsZW1Ub3AgPSByZWN0LnRvcFxuICAgIGNvbnN0IGVsZW1Cb3R0b20gPSByZWN0LmJvdHRvbVxuICAgIHJldHVybiBlbGVtVG9wIDwgd2luZG93LmlubmVySGVpZ2h0ICYmIGVsZW1Cb3R0b20gPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gYm9keUNvbnRhaW5zKGVsdCkge1xuICAgIC8vIElFIEZpeFxuICAgIGNvbnN0IHJvb3ROb2RlID0gZWx0LmdldFJvb3ROb2RlICYmIGVsdC5nZXRSb290Tm9kZSgpXG4gICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QpIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMocm9vdE5vZGUuaG9zdClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHNwbGl0T25XaGl0ZXNwYWNlKHRyaWdnZXIpIHtcbiAgICByZXR1cm4gdHJpZ2dlci50cmltKCkuc3BsaXQoL1xccysvKVxuICB9XG5cbiAgLyoqXG4gICAqIG1lcmdlT2JqZWN0cyB0YWtlcyBhbGwgdGhlIGtleXMgZnJvbVxuICAgKiBvYmoyIGFuZCBkdXBsaWNhdGVzIHRoZW0gaW50byBvYmoxXG4gICAqIEB0ZW1wbGF0ZSBUMVxuICAgKiBAdGVtcGxhdGUgVDJcbiAgICogQHBhcmFtIHtUMX0gb2JqMVxuICAgKiBAcGFyYW0ge1QyfSBvYmoyXG4gICAqIEByZXR1cm5zIHtUMSAmIFQyfVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmoyKSB7XG4gICAgICBpZiAob2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgcmV0dXJuIG9iajFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30galN0cmluZ1xuICAgKiBAcmV0dXJucyB7YW55fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUpTT04oalN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShqU3RyaW5nKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dFcnJvcihlcnJvcilcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkge1xuICAgIGNvbnN0IHRlc3QgPSAnaHRteDpsb2NhbFN0b3JhZ2VUZXN0J1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KVxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoKVxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBwYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCB1bmxlc3MgaW5kZXggcGFnZVxuICAgICAgaWYgKCEoL15cXC8kLy50ZXN0KHBhdGgpKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBiZSBraW5kIHRvIElFMTEsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBVUkwoKVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHVibGljIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gaW50ZXJuYWxFdmFsKHN0cikge1xuICAgIHJldHVybiBtYXliZUV2YWwoZ2V0RG9jdW1lbnQoKS5ib2R5LCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBldmFsKHN0cilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjYWxsYmFjayBmb3IgdGhlICoqaHRteDpsb2FkKiogZXZlbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvY2VzcyBuZXcgY29udGVudCwgZm9yIGV4YW1wbGUgaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50IHdpdGggYSBqYXZhc2NyaXB0IGxpYnJhcnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25Mb2FkXG4gICAqXG4gICAqIEBwYXJhbSB7KGVsdDogTm9kZSkgPT4gdm9pZH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGNhbGwgb24gbmV3bHkgbG9hZGVkIGNvbnRlbnRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvbkxvYWRIZWxwZXIoY2FsbGJhY2spIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0bXgub24oJ2h0bXg6bG9hZCcsIC8qKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldnQgKi8gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjYWxsYmFjayhldnQuZGV0YWlsLmVsdClcbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIExvZyBhbGwgaHRteCBldmVudHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dBbGxcbiAgICovXG4gIGZ1bmN0aW9uIGxvZ0FsbCgpIHtcbiAgICBodG14LmxvZ2dlciA9IGZ1bmN0aW9uKGVsdCwgZXZlbnQsIGRhdGEpIHtcbiAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LCBlbHQsIGRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nTm9uZSgpIHtcbiAgICBodG14LmxvZ2dlciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudCBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZEFsbFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudHMgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD59XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQWxsKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRBbGwoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgV2luZG93XG4gICAqL1xuICBmdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHdpbmRvd1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsdCwgZGVsYXkpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUVsZW1lbnQoZWx0KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RWx0KGVsdCkucmVtb3ZlQ2hpbGQoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0h0bWxFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqIEByZXR1cm4ge1BhcmVudE5vZGV8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzUGFyZW50Tm9kZShlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFkZHMgYSBjbGFzcyB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWRkQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgY2xhc3MgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byBhZGRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSBjbGFzcyBpcyBhZGRlZFxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eiwgZGVsYXkpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0LmNsYXNzTGlzdCAmJiBlbHQuY2xhc3NMaXN0LmFkZChjbGF6eilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsYXNzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gbm9kZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgY2xhc3MgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgY2xhc3MgaXMgcmVtb3ZlZClcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQobm9kZSwgY2xhenosIGRlbGF5KSB7XG4gICAgbGV0IGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KG5vZGUpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShjbGF6eilcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGNsYXNzZXMgbGVmdCwgcmVtb3ZlIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGdpdmVuIGNsYXNzIG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdG9nZ2xlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRvZ2dsZSB0aGUgY2xhc3Mgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0b2dnbGVcbiAgICovXG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzT25FbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBlbHQuY2xhc3NMaXN0LnRvZ2dsZShjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSBpdHMgc2libGluZ3MsIHNvIHRoYXQgYW1vbmcgaXRzIHNpYmxpbmdzLCBvbmx5IHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Rha2VDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRha2UgdGhlIGNsYXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdGFrZVxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNsYXNzRm9yRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZm9yRWFjaChlbHQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXp6KVxuICAgIH0pXG4gICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGVsdCksIGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjbG9zZXN0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzIHBhcmVudGFnZSwgaW5jbHVzaXZlIG9mIHRoZSBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2Nsb3Nlc3RcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIHNlbGVjdG9yIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBmaW5kXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZXN0KGVsdCwgc2VsZWN0b3IpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmIChlbHQgJiYgZWx0LmNsb3Nlc3QpIHtcbiAgICAgIHJldHVybiBlbHQuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyByZW1vdmUgd2hlbiBJRSBnb2VzIGF3YXlcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGVsdCA9PSBudWxsIHx8IG1hdGNoZXMoZWx0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbHQgPSBlbHQgJiYgYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSlcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwcmVmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzdWZmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgPT09IHN1ZmZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICBjb25zdCB0cmltbWVkU2VsZWN0b3IgPSBzZWxlY3Rvci50cmltKClcbiAgICBpZiAoc3RhcnRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICc8JykgJiYgZW5kc1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnLz4nKSkge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3Rvci5zdWJzdHJpbmcoMSwgdHJpbW1lZFNlbGVjdG9yLmxlbmd0aCAtIDIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfEVsZW1lbnR8RG9jdW1lbnR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLCBnbG9iYWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoc2VsZWN0b3IuaW5kZXhPZignY2xvc2VzdCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtjbG9zZXN0KGFzRWxlbWVudChlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOCkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2ZpbmQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbZmluZChhc1BhcmVudE5vZGUoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ25leHQnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLm5leHRFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ25leHQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkZvcndhcmRRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncHJldmlvdXMnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdwcmV2aW91cyAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuQmFja3dhcmRzUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudF1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnd2luZG93Jykge1xuICAgICAgcmV0dXJuIFt3aW5kb3ddXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2JvZHknKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50LmJvZHldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3Jvb3QnKSB7XG4gICAgICByZXR1cm4gW2dldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZ2xvYmFsICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLnNsaWNlKDcpLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdG9BcnJheShhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkZvcndhcmRRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5CYWNrd2FyZHNRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd31cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3RvcilbMF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZ2V0RG9jdW1lbnQoKS5ib2R5LCBlbHRPclNlbGVjdG9yKVswXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge0V2ZW50VGFyZ2V0fSBUXG4gICAqIEBwYXJhbSB7VHxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtUfSBbY29udGV4dF1cbiAgICogQHJldHVybnMge0VsZW1lbnR8VHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVRhcmdldChlbHRPclNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZpbmQoYXNQYXJlbnROb2RlKGNvbnRleHQpIHx8IGRvY3VtZW50LCBlbHRPclNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7a2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcHxzdHJpbmd9IEFueUV2ZW50TmFtZVxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXZlbnRBcmdzXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICAgKiBAcHJvcGVydHkge0FueUV2ZW50TmFtZX0gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxBbnlFdmVudE5hbWV9IGFyZzFcbiAgICogQHBhcmFtIHtBbnlFdmVudE5hbWV8RXZlbnRMaXN0ZW5lcn0gYXJnMlxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXVxuICAgKiBAcmV0dXJucyB7RXZlbnRBcmdzfVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oYXJnMikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogZ2V0RG9jdW1lbnQoKS5ib2R5LFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMSksXG4gICAgICAgIGxpc3RlbmVyOiBhcmcyXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogcmVzb2x2ZVRhcmdldChhcmcxKSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzIpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnM1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBsaXN0ZW5lciB0byB8IHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3IgfCB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICBjb25zdCBiID0gaXNGdW5jdGlvbihhcmcyKVxuICAgIHJldHVybiBiID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvZmZcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oYXJnMikgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTm9kZSBwcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3QgRFVNTVlfRUxUID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdvdXRwdXQnKSAvLyBkdW1teSBlbGVtZW50IGZvciBiYWQgc2VsZWN0b3JzXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ck5hbWVcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgYXR0ck5hbWUpIHtcbiAgICBjb25zdCBhdHRyVGFyZ2V0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0ck5hbWUpXG4gICAgaWYgKGF0dHJUYXJnZXQpIHtcbiAgICAgIGlmIChhdHRyVGFyZ2V0ID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIFtmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyTmFtZSldXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgYXR0clRhcmdldClcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsb2dFcnJvcignVGhlIHNlbGVjdG9yIFwiJyArIGF0dHJUYXJnZXQgKyAnXCIgb24gJyArIGF0dHJOYW1lICsgJyByZXR1cm5lZCBubyBtYXRjaGVzIScpXG4gICAgICAgICAgcmV0dXJuIFtEVU1NWV9FTFRdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBhc0VsZW1lbnQoZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoYXNFbGVtZW50KGVsdCksIGF0dHJpYnV0ZSkgIT0gbnVsbFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VGFyZ2V0KGVsdCkge1xuICAgIGNvbnN0IHRhcmdldFN0ciA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKVxuICAgIGlmICh0YXJnZXRTdHIpIHtcbiAgICAgIGlmICh0YXJnZXRTdHIgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRhcmdldFN0cilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAoZGF0YS5ib29zdGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUobmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXNUb1NldHRsZSA9IGh0bXguY29uZmlnLmF0dHJpYnV0ZXNUb1NldHRsZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlc1RvU2V0dGxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmFtZSA9PT0gYXR0cmlidXRlc1RvU2V0dGxlW2ldKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VUb1xuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlRnJvbVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvbmVBdHRyaWJ1dGVzKG1lcmdlVG8sIG1lcmdlRnJvbSkge1xuICAgIGZvckVhY2gobWVyZ2VUby5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoIW1lcmdlRnJvbS5oYXNBdHRyaWJ1dGUoYXR0ci5uYW1lKSAmJiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKG1lcmdlRnJvbS5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpIHtcbiAgICBjb25zdCBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyh0YXJnZXQpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzSW5saW5lU3dhcChzd2FwU3R5bGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFN0eWxlID09PSAnb3V0ZXJIVE1MJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvb2JWYWx1ZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9vYkVsZW1lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGxldCBzZWxlY3RvciA9ICcjJyArIGdldFJhd0F0dHJpYnV0ZShvb2JFbGVtZW50LCAnaWQnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFN0eWxlICovXG4gICAgbGV0IHN3YXBTdHlsZSA9ICdvdXRlckhUTUwnXG4gICAgaWYgKG9vYlZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKG9vYlZhbHVlLmluZGV4T2YoJzonKSA+IDApIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlLnN1YnN0cigwLCBvb2JWYWx1ZS5pbmRleE9mKCc6JykpXG4gICAgICBzZWxlY3RvciA9IG9vYlZhbHVlLnN1YnN0cihvb2JWYWx1ZS5pbmRleE9mKCc6JykgKyAxLCBvb2JWYWx1ZS5sZW5ndGgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICBpZiAodGFyZ2V0cykge1xuICAgICAgZm9yRWFjaChcbiAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgICAgbGV0IGZyYWdtZW50XG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudENsb25lID0gb29iRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICBmcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQob29iRWxlbWVudENsb25lKVxuICAgICAgICAgIGlmICghaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBhc1BhcmVudE5vZGUob29iRWxlbWVudENsb25lKSAvLyBpZiB0aGlzIGlzIG5vdCBhbiBpbmxpbmUgc3dhcCwgd2UgdXNlIHRoZSBjb250ZW50IG9mIHRoZSBub2RlLCBub3QgdGhlIG5vZGUgaXRzZWxmXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlU3dhcERldGFpbHMgPSB7IHNob3VsZFN3YXA6IHRydWUsIHRhcmdldCwgZnJhZ21lbnQgfVxuICAgICAgICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6b29iQmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICAgICAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgICAgICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgICAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCB0YXJnZXQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14Om9vYkFmdGVyU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6b29iRXJyb3JOb1RhcmdldCcsIHsgY29udGVudDogb29iRWxlbWVudCB9KVxuICAgIH1cbiAgICByZXR1cm4gb29iVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudCkge1xuICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ1toeC1wcmVzZXJ2ZV0sIFtkYXRhLWh4LXByZXNlcnZlXScpLCBmdW5jdGlvbihwcmVzZXJ2ZWRFbHQpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0QXR0cmlidXRlVmFsdWUocHJlc2VydmVkRWx0LCAnaWQnKVxuICAgICAgY29uc3Qgb2xkRWx0ID0gZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgIGlmIChvbGRFbHQgIT0gbnVsbCkge1xuICAgICAgICBwcmVzZXJ2ZWRFbHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQob2xkRWx0LCBwcmVzZXJ2ZWRFbHQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyksIGZ1bmN0aW9uKG5ld05vZGUpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UmF3QXR0cmlidXRlKG5ld05vZGUsICdpZCcpXG4gICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkSWQgPSBpZC5yZXBsYWNlKFwiJ1wiLCBcIlxcXFwnXCIpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYWcgPSBuZXdOb2RlLnRhZ05hbWUucmVwbGFjZSgnOicsICdcXFxcOicpXG4gICAgICAgIGNvbnN0IHBhcmVudEVsdCA9IGFzUGFyZW50Tm9kZShwYXJlbnROb2RlKVxuICAgICAgICBjb25zdCBvbGROb2RlID0gcGFyZW50RWx0ICYmIHBhcmVudEVsdC5xdWVyeVNlbGVjdG9yKG5vcm1hbGl6ZWRUYWcgKyBcIltpZD0nXCIgKyBub3JtYWxpemVkSWQgKyBcIiddXCIpXG4gICAgICAgIGlmIChvbGROb2RlICYmIG9sZE5vZGUgIT09IHBhcmVudEVsdCkge1xuICAgICAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBuZXdOb2RlLmNsb25lTm9kZSgpXG4gICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG9sZE5vZGUpXG4gICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG5ld0F0dHJpYnV0ZXMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBjaGlsZFxuICAgKiBAcmV0dXJucyB7SHRteFNldHRsZVRhc2t9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlQWpheExvYWRUYXNrKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHByb2Nlc3NOb2RlKGFzRWxlbWVudChjaGlsZCkpXG4gICAgICBwcm9jZXNzRm9jdXMoYXNQYXJlbnROb2RlKGNoaWxkKSlcbiAgICAgIHRyaWdnZXJFdmVudChjaGlsZCwgJ2h0bXg6bG9hZCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gY2hpbGRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NGb2N1cyhjaGlsZCkge1xuICAgIGNvbnN0IGF1dG9mb2N1cyA9ICdbYXV0b2ZvY3VzXSdcbiAgICBjb25zdCBhdXRvRm9jdXNlZEVsdCA9IGFzSHRtbEVsZW1lbnQobWF0Y2hlcyhjaGlsZCwgYXV0b2ZvY3VzKSA/IGNoaWxkIDogY2hpbGQucXVlcnlTZWxlY3RvcihhdXRvZm9jdXMpKVxuICAgIGlmIChhdXRvRm9jdXNlZEVsdCAhPSBudWxsKSB7XG4gICAgICBhdXRvRm9jdXNlZEVsdC5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge05vZGV9IGluc2VydEJlZm9yZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydEJlZm9yZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIHdoaWxlIChmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZFxuICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGNoaWxkKSwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbnNlcnRCZWZvcmUpXG4gICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJhc2VkIG9uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2h5YW1hbW90by9mZDQzNTUwNWQyOWViZmEzZDk3MTZmZDJiZThkNDJmMCxcbiAgICogZGVyaXZlZCBmcm9tIEphdmEncyBzdHJpbmcgaGFzaGNvZGUgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaGFzaFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nSGFzaChzdHJpbmcsIGhhc2gpIHtcbiAgICBsZXQgY2hhciA9IDBcbiAgICB3aGlsZSAoY2hhciA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBzdHJpbmcuY2hhckNvZGVBdChjaGFyKyspIHwgMCAvLyBiaXR3aXNlIG9yIGVuc3VyZXMgd2UgaGF2ZSBhIDMyLWJpdCBpbnRcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYXR0cmlidXRlSGFzaChlbHQpIHtcbiAgICBsZXQgaGFzaCA9IDBcbiAgICAvLyBJRSBmaXhcbiAgICBpZiAoZWx0LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWx0LmF0dHJpYnV0ZXNbaV1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZS52YWx1ZSkgeyAvLyBvbmx5IGluY2x1ZGUgYXR0cmlidXRlcyB3LyBhY3R1YWwgdmFsdWVzIChlbXB0eSBpcyBzYW1lIGFzIG5vbi1leGlzdGVudClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUubmFtZSwgaGFzaClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUudmFsdWUsIGhhc2gpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE9uSGFuZGxlcnMoZWx0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZm8gPSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1tpXVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChlbHQsIGhhbmRsZXJJbmZvLmV2ZW50LCBoYW5kbGVySW5mby5saXN0ZW5lcilcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE5vZGUoZWxlbWVudCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbGVtZW50KVxuICAgIGlmIChpbnRlcm5hbERhdGEudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVybmFsRGF0YS50aW1lb3V0KVxuICAgIH1cbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MpIHtcbiAgICAgIGZvckVhY2goaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MsIGZ1bmN0aW9uKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8ub24pIHtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChpbmZvLm9uLCBpbmZvLnRyaWdnZXIsIGluZm8ubGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWxlbWVudClcbiAgICBmb3JFYWNoKE9iamVjdC5rZXlzKGludGVybmFsRGF0YSksIGZ1bmN0aW9uKGtleSkgeyBkZWxldGUgaW50ZXJuYWxEYXRhW2tleV0gfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuVXBFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKVxuICAgIGRlSW5pdE5vZGUoZWxlbWVudClcbiAgICAvLyBAdHMtaWdub3JlIElFMTEgY29kZVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikgeyAvLyBJRVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yRWFjaChlbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkgeyBjbGVhblVwRWxlbWVudChjaGlsZCkgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiB0YXJnZXQudGFnTmFtZSA9PT0gJ0JPRFknKSB7IC8vIHNwZWNpYWwgY2FzZSB0aGUgYm9keSB0byBpbm5lckhUTUwgYmVjYXVzZSBEb2N1bWVudEZyYWdtZW50cyBjYW4ndCBjb250YWluIGEgYm9keSBlbHQgdW5mb3J0dW5hdGVseVxuICAgICAgcmV0dXJuIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtOb2RlfSAqL1xuICAgIGxldCBuZXdFbHRcbiAgICBjb25zdCBlbHRCZWZvcmVOZXdDb250ZW50ID0gdGFyZ2V0LnByZXZpb3VzU2libGluZ1xuICAgIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChlbHRCZWZvcmVOZXdDb250ZW50ID09IG51bGwpIHtcbiAgICAgIG5ld0VsdCA9IHBhcmVudEVsdCh0YXJnZXQpLmZpcnN0Q2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWx0ID0gZWx0QmVmb3JlTmV3Q29udGVudC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBzZXR0bGVJbmZvLmVsdHMgPSBzZXR0bGVJbmZvLmVsdHMuZmlsdGVyKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUgIT09IHRhcmdldCB9KVxuICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgbmV3bHkgYWRkZWQgY29udGVudCBhbmQgYWRkIGFsbCBlbGVtZW50cyB0byB0aGUgc2V0dGxlIGluZm8gc28gd2UgdHJpZ2dlclxuICAgIC8vIGV2ZW50cyBwcm9wZXJseSBvbiB0aGVtXG4gICAgd2hpbGUgKG5ld0VsdCAmJiBuZXdFbHQgIT09IHRhcmdldCkge1xuICAgICAgaWYgKG5ld0VsdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgc2V0dGxlSW5mby5lbHRzLnB1c2gobmV3RWx0KVxuICAgICAgfVxuICAgICAgbmV3RWx0ID0gbmV3RWx0Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGFyZ2V0LnJlbW92ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgdGFyZ2V0LmZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBudWxsLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQubmV4dFNpYmxpbmcsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqL1xuICBmdW5jdGlvbiBzd2FwRGVsZXRlKHRhcmdldCkge1xuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICByZXR1cm4gcGFyZW50RWx0KHRhcmdldCkucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgY29uc3QgZmlyc3RDaGlsZCA9IHRhcmdldC5maXJzdENoaWxkXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBmaXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgd2hpbGUgKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICB9XG4gICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkKVxuICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHN3aXRjaCAoc3dhcFN0eWxlKSB7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdvdXRlckhUTUwnOlxuICAgICAgICBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJiZWdpbic6XG4gICAgICAgIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlYmVnaW4nOlxuICAgICAgICBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmVlbmQnOlxuICAgICAgICBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJlbmQnOlxuICAgICAgICBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBzd2FwRGVsZXRlKHRhcmdldClcbiAgICAgICAgcmV0dXJuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMoZWx0KVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBleHRlbnNpb25zW2ldXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZXh0LmhhbmRsZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0VsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGhhbmRsZVN3YXAgcmV0dXJucyBhbiBhcnJheSAobGlrZSkgb2YgZWxlbWVudHMsIHdlIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdFbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBuZXdFbGVtZW50c1tqXVxuICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3dhcFN0eWxlID09PSAnaW5uZXJIVE1MJykge1xuICAgICAgICAgIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2FwV2l0aFN0eWxlKGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICB2YXIgb29iRWx0cyA9IGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtc3dhcC1vb2JdLCBbZGF0YS1oeC1zd2FwLW9vYl0nKVxuICAgIGZvckVhY2gob29iRWx0cywgZnVuY3Rpb24ob29iRWxlbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93TmVzdGVkT29iU3dhcHMgfHwgb29iRWxlbWVudC5wYXJlbnRFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG9vYlZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUob29iRWxlbWVudCwgJ2h4LXN3YXAtb29iJylcbiAgICAgICAgaWYgKG9vYlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaHgtc3dhcC1vb2InKVxuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oeC1zd2FwLW9vYicpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gb29iRWx0cy5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBjb21wbGV0ZSBzd2FwcGluZyBwaXBlbGluZSwgaW5jbHVkaW5nOiBmb2N1cyBhbmQgc2VsZWN0aW9uIHByZXNlcnZhdGlvbixcbiAgICogdGl0bGUgdXBkYXRlcywgc2Nyb2xsLCBPT0Igc3dhcHBpbmcsIG5vcm1hbCBzd2FwcGluZyBhbmQgc2V0dGxpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKiBAcGFyYW0ge1N3YXBPcHRpb25zfSBbc3dhcE9wdGlvbnNdXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwKHRhcmdldCwgY29udGVudCwgc3dhcFNwZWMsIHN3YXBPcHRpb25zKSB7XG4gICAgaWYgKCFzd2FwT3B0aW9ucykge1xuICAgICAgc3dhcE9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIHRhcmdldCA9IHJlc29sdmVUYXJnZXQodGFyZ2V0KVxuXG4gICAgLy8gcHJlc2VydmUgZm9jdXMgYW5kIHNlbGVjdGlvblxuICAgIGNvbnN0IGFjdGl2ZUVsdCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICBsZXQgc2VsZWN0aW9uSW5mbyA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIHNlbGVjdGlvbkluZm8gPSB7XG4gICAgICAgIGVsdDogYWN0aXZlRWx0LFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXJ0OiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uU3RhcnQgOiBudWxsLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVuZDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvbkVuZCA6IG51bGxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzYWZhcmkgaXNzdWUgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9wbGF5d3JpZ2h0L2lzc3Vlcy81ODk0XG4gICAgfVxuICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpXG5cbiAgICAvLyBGb3IgdGV4dCBjb250ZW50IHN3YXBzLCBkb24ndCBwYXJzZSB0aGUgcmVzcG9uc2UgYXMgSFRNTCwganVzdCBpbnNlcnQgaXRcbiAgICBpZiAoc3dhcFNwZWMuc3dhcFN0eWxlID09PSAndGV4dENvbnRlbnQnKSB7XG4gICAgICB0YXJnZXQudGV4dENvbnRlbnQgPSBjb250ZW50XG4gICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBmcmFnbWVudCBhbmQgcHJvY2VzcyBpdFxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY29udGVudClcblxuICAgICAgc2V0dGxlSW5mby50aXRsZSA9IGZyYWdtZW50LnRpdGxlXG5cbiAgICAgIC8vIHNlbGVjdC1vb2Igc3dhcHNcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3RPT0IpIHtcbiAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWVzID0gc3dhcE9wdGlvbnMuc2VsZWN0T09CLnNwbGl0KCcsJylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvb2JTZWxlY3RWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlc1tpXS5zcGxpdCgnOicsIDIpXG4gICAgICAgICAgbGV0IGlkID0gb29iU2VsZWN0VmFsdWVbMF0udHJpbSgpXG4gICAgICAgICAgaWYgKGlkLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcoMSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBvb2JTZWxlY3RWYWx1ZVsxXSB8fCAndHJ1ZSdcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignIycgKyBpZClcbiAgICAgICAgICBpZiAob29iRWxlbWVudCkge1xuICAgICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9vYiBzd2Fwc1xuICAgICAgZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ3RlbXBsYXRlJyksIC8qKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlICovZnVuY3Rpb24odGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGZpbmRBbmRTd2FwT29iRWxlbWVudHModGVtcGxhdGUuY29udGVudCwgc2V0dGxlSW5mbykpIHtcbiAgICAgICAgICAvLyBBdm9pZCBwb2xsdXRpbmcgdGhlIERPTSB3aXRoIGVtcHR5IHRlbXBsYXRlcyB0aGF0IHdlcmUgb25seSB1c2VkIHRvIGVuY2Fwc3VsYXRlIG9vYiBzd2FwXG4gICAgICAgICAgdGVtcGxhdGUucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gbm9ybWFsIHN3YXBcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3QpIHtcbiAgICAgICAgY29uc3QgbmV3RnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3dhcE9wdGlvbnMuc2VsZWN0KSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIG5ld0ZyYWdtZW50LmFwcGVuZENoaWxkKG5vZGUpXG4gICAgICAgIH0pXG4gICAgICAgIGZyYWdtZW50ID0gbmV3RnJhZ21lbnRcbiAgICAgIH1cbiAgICAgIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KVxuICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3BlYy5zd2FwU3R5bGUsIHN3YXBPcHRpb25zLmNvbnRleHRFbGVtZW50LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cblxuICAgIC8vIGFwcGx5IHNhdmVkIGZvY3VzIGFuZCBzZWxlY3Rpb24gaW5mb3JtYXRpb24gdG8gc3dhcHBlZCBjb250ZW50XG4gICAgaWYgKHNlbGVjdGlvbkluZm8uZWx0ICYmXG4gICAgICAhYm9keUNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZWx0KSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSkge1xuICAgICAgY29uc3QgbmV3QWN0aXZlRWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSlcbiAgICAgIGNvbnN0IGZvY3VzT3B0aW9ucyA9IHsgcHJldmVudFNjcm9sbDogc3dhcFNwZWMuZm9jdXNTY3JvbGwgIT09IHVuZGVmaW5lZCA/ICFzd2FwU3BlYy5mb2N1c1Njcm9sbCA6ICFodG14LmNvbmZpZy5kZWZhdWx0Rm9jdXNTY3JvbGwgfVxuICAgICAgaWYgKG5ld0FjdGl2ZUVsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChzZWxlY3Rpb25JbmZvLnN0YXJ0ICYmIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uSW5mby5zdGFydCwgc2VsZWN0aW9uSW5mby5lbmQpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdGhlIHNldFNlbGVjdGlvblJhbmdlIG1ldGhvZCBpcyBwcmVzZW50IG9uIGZpZWxkcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQsIHNvIGp1c3QgbGV0IHRoaXMgZmFpbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdBY3RpdmVFbHQuZm9jdXMoZm9jdXNPcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG4gICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU3dhcCcsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICB9KVxuICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaykge1xuICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2soKVxuICAgIH1cblxuICAgIC8vIG1lcmdlIGluIG5ldyB0aXRsZSBhZnRlciBzd2FwIGJ1dCBiZWZvcmUgc2V0dGxlXG4gICAgaWYgKCFzd2FwU3BlYy5pZ25vcmVUaXRsZSkge1xuICAgICAgaGFuZGxlVGl0bGUoc2V0dGxlSW5mby50aXRsZSlcbiAgICB9XG5cbiAgICAvLyBzZXR0bGVcbiAgICBjb25zdCBkb1NldHRsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLnRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgIHRhc2suY2FsbCgpXG4gICAgICB9KVxuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTZXR0bGUnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgICB9KVxuXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYW5jaG9yKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclRhcmdldCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KCcjJyArIHN3YXBPcHRpb25zLmFuY2hvcikpXG4gICAgICAgIGlmIChhbmNob3JUYXJnZXQpIHtcbiAgICAgICAgICBhbmNob3JUYXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6ICdhdXRvJyB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVNjcm9sbFN0YXRlKHNldHRsZUluZm8uZWx0cywgc3dhcFNwZWMpXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaykge1xuICAgICAgICBzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3dhcFNwZWMuc2V0dGxlRGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU2V0dGxlLCBzd2FwU3BlYy5zZXR0bGVEZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TZXR0bGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCBoZWFkZXIsIGVsdCkge1xuICAgIGNvbnN0IHRyaWdnZXJCb2R5ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlcilcbiAgICBpZiAodHJpZ2dlckJvZHkuaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICBjb25zdCB0cmlnZ2VycyA9IHBhcnNlSlNPTih0cmlnZ2VyQm9keSlcbiAgICAgIGZvciAoY29uc3QgZXZlbnROYW1lIGluIHRyaWdnZXJzKSB7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgICAgbGV0IGRldGFpbCA9IHRyaWdnZXJzW2V2ZW50TmFtZV1cbiAgICAgICAgICBpZiAoaXNSYXdPYmplY3QoZGV0YWlsKSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWx0ID0gZGV0YWlsLnRhcmdldCAhPT0gdW5kZWZpbmVkID8gZGV0YWlsLnRhcmdldCA6IGVsdFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRhaWwgPSB7IHZhbHVlOiBkZXRhaWwgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBldmVudE5hbWVzID0gdHJpZ2dlckJvZHkuc3BsaXQoJywnKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZXNbaV0udHJpbSgpLCBbXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBXSElURVNQQUNFID0gL1xccy9cbiAgY29uc3QgV0hJVEVTUEFDRV9PUl9DT01NQSA9IC9bXFxzLF0vXG4gIGNvbnN0IFNZTUJPTF9TVEFSVCA9IC9bXyRhLXpBLVpdL1xuICBjb25zdCBTWU1CT0xfQ09OVCA9IC9bXyRhLXpBLVowLTldL1xuICBjb25zdCBTVFJJTkdJU0hfU1RBUlQgPSBbJ1wiJywgXCInXCIsICcvJ11cbiAgY29uc3QgTk9UX1dISVRFU1BBQ0UgPSAvW15cXHNdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVCA9IC9beyhdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQgPSAvW30pXS9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZVN0cmluZyhzdHIpIHtcbiAgICAvKiogQHR5cGUgc3RyaW5nW10gKi9cbiAgICBjb25zdCB0b2tlbnMgPSBbXVxuICAgIGxldCBwb3NpdGlvbiA9IDBcbiAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoKSB7XG4gICAgICBpZiAoU1lNQk9MX1NUQVJULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbikpKSB7XG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgd2hpbGUgKFNZTUJPTF9DT05ULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbiArIDEpKSkge1xuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIGlmIChTVFJJTkdJU0hfU1RBUlQuaW5kZXhPZihzdHIuY2hhckF0KHBvc2l0aW9uKSkgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2hhciA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoICYmIHN0ci5jaGFyQXQocG9zaXRpb24pICE9PSBzdGFydENoYXIpIHtcbiAgICAgICAgICBpZiAoc3RyLmNoYXJBdChwb3NpdGlvbikgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHRva2Vucy5wdXNoKHN5bWJvbClcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9uKytcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBsYXN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkge1xuICAgIHJldHVybiBTWU1CT0xfU1RBUlQuZXhlYyh0b2tlbi5jaGFyQXQoMCkpICYmXG4gICAgICB0b2tlbiAhPT0gJ3RydWUnICYmXG4gICAgICB0b2tlbiAhPT0gJ2ZhbHNlJyAmJlxuICAgICAgdG9rZW4gIT09ICd0aGlzJyAmJlxuICAgICAgdG9rZW4gIT09IHBhcmFtTmFtZSAmJlxuICAgICAgbGFzdCAhPT0gJy4nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Q29uZGl0aW9uYWxGdW5jdGlvbnxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCBwYXJhbU5hbWUpIHtcbiAgICBpZiAodG9rZW5zWzBdID09PSAnWycpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICBsZXQgYnJhY2tldENvdW50ID0gMVxuICAgICAgbGV0IGNvbmRpdGlvbmFsU291cmNlID0gJyByZXR1cm4gKGZ1bmN0aW9uKCcgKyBwYXJhbU5hbWUgKyAnKXsgcmV0dXJuICgnXG4gICAgICBsZXQgbGFzdCA9IG51bGxcbiAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1swXVxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBzaGlmdCBjYWxsLCBhbmQgdGhpbmtzIHdlJ3JlIGNvbXBhcmluZyB0aGUgc2FtZSB2YWx1ZSBoZXJlLCBpLmUuICdbJyB2cyAnXSdcbiAgICAgICAgaWYgKHRva2VuID09PSAnXScpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQtLVxuICAgICAgICAgIGlmIChicmFja2V0Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChsYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyAndHJ1ZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKX0pJ1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uRnVuY3Rpb24gPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oY29uZGl0aW9uYWxTb3VyY2UpKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pXG4gICAgICAgICAgICAgIGNvbmRpdGlvbkZ1bmN0aW9uLnNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlXG4gICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25GdW5jdGlvblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnN5bnRheDplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZTogY29uZGl0aW9uYWxTb3VyY2UgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdbJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudCsrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSkge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcoKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpID8gKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpIDogKHdpbmRvdy4nICsgdG9rZW4gKyAnKSknXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArIHRva2VuXG4gICAgICAgIH1cbiAgICAgICAgbGFzdCA9IHRva2Vucy5zaGlmdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gbWF0Y2hcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbCh0b2tlbnMsIG1hdGNoKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmICFtYXRjaC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHJlc3VsdCArPSB0b2tlbnMuc2hpZnQoKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKSB7XG4gICAgbGV0IHJlc3VsdFxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMCAmJiBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQpLnRyaW0oKVxuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY29uc3QgSU5QVVRfU0VMRUNUT1IgPSAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBsaWNpdFRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIGZvciB0cmlnZ2VyIHNwZWNzXG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSkge1xuICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXSAqL1xuICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVTdHJpbmcoZXhwbGljaXRUcmlnZ2VyKVxuICAgIGRvIHtcbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IHRva2Vucy5sZW5ndGhcbiAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLylcbiAgICAgIGlmICh0cmlnZ2VyICE9PSAnJykge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2V2ZXJ5Jykge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCBldmVyeSA9IHsgdHJpZ2dlcjogJ2V2ZXJ5JyB9XG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgZXZlcnkucG9sbEludGVydmFsID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLykpXG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgZXZlcnkuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaChldmVyeSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgdHJpZ2dlclNwZWMgPSB7IHRyaWdnZXIgfVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXSAhPT0gJywnKSB7XG4gICAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gJ2NoYW5nZWQnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnb25jZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMub25jZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdjb25zdW1lJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jb25zdW1lID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2RlbGF5JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5kZWxheSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZnJvbScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgaWYgKENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgICAgICBpZiAoZnJvbV9hcmcgPT09ICdjbG9zZXN0JyB8fCBmcm9tX2FyZyA9PT0gJ2ZpbmQnIHx8IGZyb21fYXJnID09PSAnbmV4dCcgfHwgZnJvbV9hcmcgPT09ICdwcmV2aW91cycpIHtcbiAgICAgICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgICAgICAvLyBgbmV4dGAgYW5kIGBwcmV2aW91c2AgYWxsb3cgYSBzZWxlY3Rvci1sZXNzIHN5bnRheFxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbV9hcmcgKz0gJyAnICsgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZnJvbSA9IGZyb21fYXJnXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGFyZ2V0JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50YXJnZXQgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Rocm90dGxlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50aHJvdHRsZSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncXVldWUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnF1ZXVlID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdyb290JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RocmVzaG9sZCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2godHJpZ2dlclNwZWMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSBpbml0aWFsTGVuZ3RoKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgIH0gd2hpbGUgKHRva2Vuc1swXSA9PT0gJywnICYmIHRva2Vucy5zaGlmdCgpKVxuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSA9IHRyaWdnZXJTcGVjc1xuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VHJpZ2dlclNwZWNzKGVsdCkge1xuICAgIGNvbnN0IGV4cGxpY2l0VHJpZ2dlciA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRyaWdnZXInKVxuICAgIGxldCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGlmIChleHBsaWNpdFRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gaHRteC5jb25maWcudHJpZ2dlclNwZWNzQ2FjaGVcbiAgICAgIHRyaWdnZXJTcGVjcyA9IChjYWNoZSAmJiBjYWNoZVtleHBsaWNpdFRyaWdnZXJdKSB8fCBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpXG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJTcGVjcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdzdWJtaXQnIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJidXR0b25cIl0sIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCBJTlBVVF9TRUxFQ1RPUikpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2hhbmdlJyB9XVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gY2FuY2VsUG9sbGluZyhlbHQpIHtcbiAgICBnZXRJbnRlcm5hbERhdGEoZWx0KS5jYW5jZWxsZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gc3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIG5vZGVEYXRhLnRpbWVvdXQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGJvZHlDb250YWlucyhlbHQpICYmIG5vZGVEYXRhLmNhbmNlbGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQoc3BlYywgZWx0LCBtYWtlRXZlbnQoJ2h4OnBvbGw6dHJpZ2dlcicsIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlYzogc3BlYyxcbiAgICAgICAgICB0YXJnZXQ6IGVsdFxuICAgICAgICB9KSkpIHtcbiAgICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpXG4gICAgICB9XG4gICAgfSwgc3BlYy5wb2xsSW50ZXJ2YWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MQW5jaG9yRWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNMb2NhbExpbmsoZWx0KSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uLmhvc3RuYW1lID09PSBlbHQuaG9zdG5hbWUgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpICE9PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGVsdElzRGlzYWJsZWQoZWx0KSB7XG4gICAgcmV0dXJuIGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqL1xuICBmdW5jdGlvbiBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgaWYgKChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBpc0xvY2FsTGluayhlbHQpICYmIChlbHQudGFyZ2V0ID09PSAnJyB8fCBlbHQudGFyZ2V0ID09PSAnX3NlbGYnKSkgfHwgKGVsdC50YWdOYW1lID09PSAnRk9STScgJiYgU3RyaW5nKGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKSkudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpKSB7XG4gICAgICBub2RlRGF0YS5ib29zdGVkID0gdHJ1ZVxuICAgICAgbGV0IHZlcmIsIHBhdGhcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgIHZlcmIgPSAnZ2V0J1xuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3QXR0cmlidXRlID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpXG4gICAgICAgIHZlcmIgPSByYXdBdHRyaWJ1dGUgPyByYXdBdHRyaWJ1dGUudG9Mb3dlckNhc2UoKSA6ICdnZXQnXG4gICAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgICB9XG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnYWN0aW9uJylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgfSwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZENhbmNlbChldnQsIG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChldnQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZXZ0LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwic3VibWl0XCJdLCBidXR0b24nKSAmJiBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGVsdC5ocmVmICYmXG4gICAgICAgIChlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT09ICcjJyB8fCBlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykuaW5kZXhPZignIycpICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fE1vdXNlRXZlbnR8S2V5Ym9hcmRFdmVudHxUb3VjaEV2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZXZ0LnR5cGUgPT09ICdjbGljaycgJiZcbiAgICAgIC8vIEB0cy1pZ25vcmUgdGhpcyB3aWxsIHJlc29sdmUgdG8gdW5kZWZpbmVkIGZvciBldmVudHMgdGhhdCBkb24ndCBkZWZpbmUgdGhvc2UgcHJvcGVydGllcywgd2hpY2ggaXMgZmluZVxuICAgICAgKGV2dC5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkge1xuICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXJcbiAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEZpbHRlci5jYWxsKGVsdCwgZXZ0KSAhPT0gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmVudEZpbHRlci5zb3VyY2VcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpldmVudEZpbHRlcjplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtleHBsaWNpdENhbmNlbF1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIGV4cGxpY2l0Q2FuY2VsKSB7XG4gICAgY29uc3QgZWxlbWVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIC8qKiBAdHlwZSB7KE5vZGV8V2luZG93KVtdfSAqL1xuICAgIGxldCBlbHRzVG9MaXN0ZW5PblxuICAgIGlmICh0cmlnZ2VyU3BlYy5mcm9tKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCB0cmlnZ2VyU3BlYy5mcm9tKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IFtlbHRdXG4gICAgfVxuICAgIC8vIHN0b3JlIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMsIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXkgY2hhbmdlXG4gICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uLmZvckVhY2goZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgfSlcbiAgICB9XG4gICAgZm9yRWFjaChlbHRzVG9MaXN0ZW5PbiwgZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGVsdFRvTGlzdGVuT24ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBsaWNpdENhbmNlbCB8fCBzaG91bGRDYW5jZWwoZXZ0LCBlbHQpKSB7XG4gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2dClcbiAgICAgICAgZXZlbnREYXRhLnRyaWdnZXJTcGVjID0gdHJpZ2dlclNwZWNcbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yID09IG51bGwpIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvciA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yLmluZGV4T2YoZWx0KSA8IDApIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvci5wdXNoKGVsdClcbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY29uc3VtZSkge1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50YXJnZXQgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKGFzRWxlbWVudChldnQudGFyZ2V0KSwgdHJpZ2dlclNwZWMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLm9uY2UpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgICAgICAgaWYgKGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEuZGVsYXllZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVsZW1lbnREYXRhLmRlbGF5ZWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocm90dGxlID4gMCkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gbnVsbFxuICAgICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy50aHJvdHRsZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLmRlbGF5ID4gMCkge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZGVsYXllZCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub2RlRGF0YS5saXN0ZW5lckluZm9zID09IG51bGwpIHtcbiAgICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcyA9IFtdXG4gICAgICB9XG4gICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyU3BlYy50cmlnZ2VyLFxuICAgICAgICBsaXN0ZW5lcjogZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgb246IGVsdFRvTGlzdGVuT25cbiAgICAgIH0pXG4gICAgICBlbHRUb0xpc3Rlbk9uLmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICB9KVxuICB9XG5cbiAgbGV0IHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2UgLy8gdXNlZCBieSBpbml0U2Nyb2xsSGFuZGxlclxuICBsZXQgc2Nyb2xsSGFuZGxlciA9IG51bGxcbiAgZnVuY3Rpb24gaW5pdFNjcm9sbEhhbmRsZXIoKSB7XG4gICAgaWYgKCFzY3JvbGxIYW5kbGVyKSB7XG4gICAgICBzY3JvbGxIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgICAgfVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpXG4gICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHdpbmRvd0lzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgICAgICAgIGZvckVhY2goZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXIqPSdyZXZlYWxlZCddLFtkYXRhLWh4LXRyaWdnZXIqPSdyZXZlYWxlZCddXCIpLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIG1heWJlUmV2ZWFsKGVsdClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVJldmVhbChlbHQpIHtcbiAgICBpZiAoIWhhc0F0dHJpYnV0ZShlbHQsICdkYXRhLWh4LXJldmVhbGVkJykgJiYgaXNTY3JvbGxlZEludG9WaWV3KGVsdCkpIHtcbiAgICAgIGVsdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaHgtcmV2ZWFsZWQnLCAndHJ1ZScpXG4gICAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAobm9kZURhdGEuaW5pdEhhc2gpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZSBub2RlIGlzbid0IGluaXRpYWxpemVkLCB3YWl0IGZvciBpdCBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgcmVxdWVzdFxuICAgICAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphZnRlclByb2Nlc3NOb2RlJywgZnVuY3Rpb24oKSB7IHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpIH0sIHsgb25jZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5XG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSW1tZWRpYXRlbHkoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgZGVsYXkpIHtcbiAgICBjb25zdCBsb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW5vZGVEYXRhLmxvYWRlZCkge1xuICAgICAgICBub2RlRGF0YS5sb2FkZWQgPSB0cnVlXG4gICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGxvYWQsIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGxldCBleHBsaWNpdEFjdGlvbiA9IGZhbHNlXG4gICAgZm9yRWFjaChWRVJCUywgZnVuY3Rpb24odmVyYikge1xuICAgICAgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC0nICsgdmVyYikpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LScgKyB2ZXJiKVxuICAgICAgICBleHBsaWNpdEFjdGlvbiA9IHRydWVcbiAgICAgICAgbm9kZURhdGEucGF0aCA9IHBhdGhcbiAgICAgICAgbm9kZURhdGEudmVyYiA9IHZlcmJcbiAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGV4cGxpY2l0QWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQGNhbGxiYWNrIFRyaWdnZXJIYW5kbGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IFtldnRdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKi9cbiAgZnVuY3Rpb24gYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGhhbmRsZXIpIHtcbiAgICBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ3JldmVhbGVkJykge1xuICAgICAgaW5pdFNjcm9sbEhhbmRsZXIoKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICAgIG1heWJlUmV2ZWFsKGFzRWxlbWVudChlbHQpKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2ludGVyc2VjdCcpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyT3B0aW9ucyA9IHt9XG4gICAgICBpZiAodHJpZ2dlclNwZWMucm9vdCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMucm9vdCA9IHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0cmlnZ2VyU3BlYy5yb290KVxuICAgICAgfVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocmVzaG9sZCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMudGhyZXNob2xkID0gcGFyc2VGbG9hdCh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpXG4gICAgICB9XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlbnRyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXVxuICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2ludGVyc2VjdCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgb2JzZXJ2ZXJPcHRpb25zKVxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShhc0VsZW1lbnQoZWx0KSlcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdsb2FkJykge1xuICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIG1ha2VFdmVudCgnbG9hZCcsIHsgZWx0IH0pKSkge1xuICAgICAgICBsb2FkSW1tZWRpYXRlbHkoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnBvbGxJbnRlcnZhbCA+IDApIHtcbiAgICAgIG5vZGVEYXRhLnBvbGxpbmcgPSB0cnVlXG4gICAgICBwcm9jZXNzUG9sbGluZyhhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3NIeE9uKG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbHQuYXR0cmlidXRlc1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdLm5hbWVcbiAgICAgIGlmIChzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb246JykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb246JykgfHxcbiAgICAgICAgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uLScpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uLScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBjb25zdCBIWF9PTl9RVUVSWSA9IG5ldyBYUGF0aEV2YWx1YXRvcigpXG4gICAgLmNyZWF0ZUV4cHJlc3Npb24oJy4vLypbQCpbIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbjpcIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb246XCIpIG9yJyArXG4gICAgICAnIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbi1cIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb24tXCIpIF1dJylcblxuICBmdW5jdGlvbiBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cykge1xuICAgIGlmIChzaG91bGRQcm9jZXNzSHhPbihlbHQpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChlbHQpKVxuICAgIH1cbiAgICBjb25zdCBpdGVyID0gSFhfT05fUVVFUlkuZXZhbHVhdGUoZWx0KVxuICAgIGxldCBub2RlID0gbnVsbFxuICAgIHdoaWxlIChub2RlID0gaXRlci5pdGVyYXRlTmV4dCgpKSBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChub2RlKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpIHtcbiAgICAvKiogQHR5cGUge0VsZW1lbnRbXX0gKi9cbiAgICBjb25zdCBlbGVtZW50cyA9IFtdXG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWx0LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgcHJvY2Vzc0hYT25Sb290KGNoaWxkLCBlbGVtZW50cylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpXG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCkge1xuICAgIGlmIChlbHQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgY29uc3QgYm9vc3RlZFNlbGVjdG9yID0gJywgW2h4LWJvb3N0XSBhLCBbZGF0YS1oeC1ib29zdF0gYSwgYVtoeC1ib29zdF0sIGFbZGF0YS1oeC1ib29zdF0nXG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvblNlbGVjdG9ycyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGUgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2VdXG4gICAgICAgIGlmIChleHRlbnNpb24uZ2V0U2VsZWN0b3JzKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMoKVxuICAgICAgICAgIGlmIChzZWxlY3RvcnMpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvblNlbGVjdG9ycy5wdXNoKHNlbGVjdG9ycylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGVsdC5xdWVyeVNlbGVjdG9yQWxsKFZFUkJfU0VMRUNUT1IgKyBib29zdGVkU2VsZWN0b3IgKyBcIiwgZm9ybSwgW3R5cGU9J3N1Ym1pdCddLFwiICtcbiAgICAgICAgJyBbaHgtZXh0XSwgW2RhdGEtaHgtZXh0XSwgW2h4LXRyaWdnZXJdLCBbZGF0YS1oeC10cmlnZ2VyXScgKyBleHRlbnNpb25TZWxlY3RvcnMuZmxhdCgpLm1hcChzID0+ICcsICcgKyBzKS5qb2luKCcnKSlcblxuICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICogc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gKi8gKGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIikpXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBlbHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIilcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGZvcm0gPSByZXNvbHZlVGFyZ2V0KCcjJyArIGdldFJhd0F0dHJpYnV0ZShlbHQsICdmb3JtJyksIGVsdC5nZXRSb290Tm9kZSgpKSB8fCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKVxuICAgIGlmICghZm9ybSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXRCdXR0b25UcmFja2luZyhlbHQpIHtcbiAgICAvLyBuZWVkIHRvIGhhbmRsZSBib3RoIGNsaWNrIGFuZCBmb2N1cyBpbjpcbiAgICAvLyAgIGZvY3VzaW4gLSBpbiBjYXNlIHNvbWVvbmUgdGFicyBpbiB0byBhIGJ1dHRvbiBhbmQgaGl0cyB0aGUgc3BhY2UgYmFyXG4gICAgLy8gICBjbGljayAtIG9uIE9TWCBidXR0b25zIGRvIG5vdCBmb2N1cyBvbiBjbGljayBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzI0XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGVcbiAgICovXG4gIGZ1bmN0aW9uIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIGNvZGUpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGVEYXRhLm9uSGFuZGxlcnMpKSB7XG4gICAgICBub2RlRGF0YS5vbkhhbmRsZXJzID0gW11cbiAgICB9XG4gICAgbGV0IGZ1bmNcbiAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICBmdW5jID0gbmV3IEZ1bmN0aW9uKCdldmVudCcsIGNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgZnVuYy5jYWxsKGVsdCwgZSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgbm9kZURhdGEub25IYW5kbGVycy5wdXNoKHsgZXZlbnQ6IGV2ZW50TmFtZSwgbGlzdGVuZXIgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0h4T25XaWxkY2FyZChlbHQpIHtcbiAgICAvLyB3aXBlIGFueSBwcmV2aW91cyBvbiBoYW5kbGVycyBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMgcHJlY2VkZW5jZVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWx0KVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGNvbnN0IHZhbHVlID0gZWx0LmF0dHJpYnV0ZXNbaV0udmFsdWVcbiAgICAgIGlmIChzdGFydHNXaXRoKG5hbWUsICdoeC1vbicpIHx8IHN0YXJ0c1dpdGgobmFtZSwgJ2RhdGEtaHgtb24nKSkge1xuICAgICAgICBjb25zdCBhZnRlck9uUG9zaXRpb24gPSBuYW1lLmluZGV4T2YoJy1vbicpICsgM1xuICAgICAgICBjb25zdCBuZXh0Q2hhciA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uLCBhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICBpZiAobmV4dENoYXIgPT09ICctJyB8fCBuZXh0Q2hhciA9PT0gJzonKSB7XG4gICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgICAvLyBpZiB0aGUgZXZlbnROYW1lIHN0YXJ0cyB3aXRoIGEgY29sb24gb3IgZGFzaCwgcHJlcGVuZCBcImh0bXhcIiBmb3Igc2hvcnRoYW5kIHN1cHBvcnRcbiAgICAgICAgICBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICc6JykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14JyArIGV2ZW50TmFtZVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICctJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoMSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnaHRteC0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSg1KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXROb2RlKGVsdCkge1xuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAobm9kZURhdGEuaW5pdEhhc2ggIT09IGF0dHJpYnV0ZUhhc2goZWx0KSkge1xuICAgICAgLy8gY2xlYW4gdXAgYW55IHByZXZpb3VzbHkgcHJvY2Vzc2VkIGluZm9cbiAgICAgIGRlSW5pdE5vZGUoZWx0KVxuXG4gICAgICBub2RlRGF0YS5pbml0SGFzaCA9IGF0dHJpYnV0ZUhhc2goZWx0KVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpXG5cbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgaWYgKGVsdC52YWx1ZSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG5vZGVEYXRhLmxhc3RWYWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBnZXRUcmlnZ2VyU3BlY3MoZWx0KVxuICAgICAgY29uc3QgaGFzRXhwbGljaXRIdHRwQWN0aW9uID0gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcblxuICAgICAgaWYgKCFoYXNFeHBsaWNpdEh0dHBBY3Rpb24pIHtcbiAgICAgICAgaWYgKGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1ib29zdCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuICAgICAgICB9IGVsc2UgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC10cmlnZ2VyJykpIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgICAgLy8gRm9yIFwibmFrZWRcIiB0cmlnZ2VycywgZG9uJ3QgZG8gYW55dGhpbmcgYXQgYWxsXG4gICAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nIHx8IChnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JyAmJiBoYXNBdHRyaWJ1dGUoZWx0LCAnZm9ybScpKSkge1xuICAgICAgICBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclByb2Nlc3NOb2RlJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIG5ldyBjb250ZW50LCBlbmFibGluZyBodG14IGJlaGF2aW9yLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgY29udGVudCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBET00gb3V0c2lkZSBvZiB0aGUgbm9ybWFsIGh0bXggcmVxdWVzdCBjeWNsZSBidXQgc3RpbGwgd2FudCBodG14IGF0dHJpYnV0ZXMgdG8gd29yay5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcHJvY2Vzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgZWxlbWVudCB0byBwcm9jZXNzXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShlbHQpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpbml0Tm9kZShlbHQpXG4gICAgZm9yRWFjaChmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSwgZnVuY3Rpb24oY2hpbGQpIHsgaW5pdE5vZGUoY2hpbGQpIH0pXG4gICAgZm9yRWFjaChmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSwgcHJvY2Vzc0h4T25XaWxkY2FyZClcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV2ZW50L0xvZyBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRldGFpbFxuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgLy8gVGhpcyBicmVha3MgZXhwZWN0ZWQgZW5jYXBzdWxhdGlvbiBidXQgbmVlZHMgdG8gYmUgaGVyZSB1bnRpbCBkZWNpZGVkIG90aGVyd2lzZSBieSBjb3JlIGRldnNcbiAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBldnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsXG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXJyb3JFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZXZlbnROYW1lIH0sIGRldGFpbCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpIHtcbiAgICByZXR1cm4gZXZlbnROYW1lID09PSAnaHRteDphZnRlclByb2Nlc3NOb2RlJ1xuICB9XG5cbiAgLyoqXG4gICAqIGB3aXRoRXh0ZW5zaW9uc2AgbG9jYXRlcyBhbGwgYWN0aXZlIGV4dGVuc2lvbnMgZm9yIGEgcHJvdmlkZWQgZWxlbWVudCwgdGhlblxuICAgKiBleGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdXNpbmcgZWFjaCBvZiB0aGUgYWN0aXZlIGV4dGVuc2lvbnMuICBJdCBzaG91bGRcbiAgICogYmUgY2FsbGVkIGludGVybmFsbHkgYXQgZXZlcnkgZXh0ZW5kYWJsZSBleGVjdXRpb24gcG9pbnQgaW4gaHRteC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHsoZXh0ZW5zaW9uOkh0bXhFeHRlbnNpb24pID0+IHZvaWR9IHRvRG9cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aEV4dGVuc2lvbnMoZWx0LCB0b0RvKSB7XG4gICAgZm9yRWFjaChnZXRFeHRlbnNpb25zKGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9EbyhleHRlbnNpb24pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ0Vycm9yKG1zZykge1xuICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1zZylcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICBjb25zb2xlLmxvZygnRVJST1I6ICcsIG1zZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBnaXZlbiBldmVudCBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RyaWdnZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byB0cmlnZ2VyXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsIGRldGFpbHMgZm9yIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRldGFpbCA9PSBudWxsKSB7XG4gICAgICBkZXRhaWwgPSB7fVxuICAgIH1cbiAgICBkZXRhaWwuZWx0ID0gZWx0XG4gICAgY29uc3QgZXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgaWYgKGh0bXgubG9nZ2VyICYmICFpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSkge1xuICAgICAgaHRteC5sb2dnZXIoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICB9XG4gICAgaWYgKGRldGFpbC5lcnJvcikge1xuICAgICAgbG9nRXJyb3IoZGV0YWlsLmVycm9yKVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6ZXJyb3InLCB7IGVycm9ySW5mbzogZGV0YWlsIH0pXG4gICAgfVxuICAgIGxldCBldmVudFJlc3VsdCA9IGVsdC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGtlYmFiTmFtZSA9IGtlYmFiRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAgICBpZiAoZXZlbnRSZXN1bHQgJiYga2ViYWJOYW1lICE9PSBldmVudE5hbWUpIHtcbiAgICAgIGNvbnN0IGtlYmFiZWRFdmVudCA9IG1ha2VFdmVudChrZWJhYk5hbWUsIGV2ZW50LmRldGFpbClcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgZWx0LmRpc3BhdGNoRXZlbnQoa2ViYWJlZEV2ZW50KVxuICAgIH1cbiAgICB3aXRoRXh0ZW5zaW9ucyhhc0VsZW1lbnQoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIChleHRlbnNpb24ub25FdmVudChldmVudE5hbWUsIGV2ZW50KSAhPT0gZmFsc2UgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgfSlcbiAgICByZXR1cm4gZXZlbnRSZXN1bHRcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhpc3RvcnkgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsZXQgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAvKipcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRIaXN0b3J5RWxlbWVudCgpIHtcbiAgICBjb25zdCBoaXN0b3J5RWx0ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpXG4gICAgcmV0dXJuIGhpc3RvcnlFbHQgfHwgZ2V0RG9jdW1lbnQoKS5ib2R5XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbHRcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVUb0hpc3RvcnlDYWNoZSh1cmwsIHJvb3RFbHQpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgc3RhdGUgdG8gc2F2ZVxuICAgIGNvbnN0IGlubmVySFRNTCA9IGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShyb290RWx0KVxuICAgIGNvbnN0IHRpdGxlID0gZ2V0RG9jdW1lbnQoKS50aXRsZVxuICAgIGNvbnN0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSA8PSAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbiBldmVudHVhbGx5IGFscmVhZHkgZXhpc3RpbmcgY2FjaGUgaXMgcHVyZ2VkXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICBoaXN0b3J5Q2FjaGUuc3BsaWNlKGksIDEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIEh0bXhIaXN0b3J5SXRlbSAqL1xuICAgIGNvbnN0IG5ld0hpc3RvcnlJdGVtID0geyB1cmwsIGNvbnRlbnQ6IGlubmVySFRNTCwgdGl0bGUsIHNjcm9sbCB9XG5cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5SXRlbUNyZWF0ZWQnLCB7IGl0ZW06IG5ld0hpc3RvcnlJdGVtLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG5cbiAgICBoaXN0b3J5Q2FjaGUucHVzaChuZXdIaXN0b3J5SXRlbSlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUpIHtcbiAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpXG4gICAgfVxuXG4gICAgLy8ga2VlcCB0cnlpbmcgdG8gc2F2ZSB0aGUgY2FjaGUgdW50aWwgaXQgc3VjY2VlZHMgb3IgaXMgZW1wdHlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5Q2FjaGUpKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZUVycm9yJywgeyBjYXVzZTogZSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuICAgICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKSAvLyBzaHJpbmsgdGhlIGNhY2hlIGFuZCByZXRyeVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeUl0ZW1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNjcm9sbFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcmV0dXJucyB7SHRteEhpc3RvcnlJdGVtfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDYWNoZWRIaXN0b3J5KHVybCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIHJldHVybiBoaXN0b3J5Q2FjaGVbaV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KGVsdCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGh0bXguY29uZmlnLnJlcXVlc3RDbGFzc1xuICAgIGNvbnN0IGNsb25lID0gLyoqIEB0eXBlIEVsZW1lbnQgKi8gKGVsdC5jbG9uZU5vZGUodHJ1ZSkpXG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnLicgKyBjbGFzc05hbWUpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhc3NOYW1lKVxuICAgIH0pXG4gICAgLy8gcmVtb3ZlIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgZm9yIGFueSBlbGVtZW50IGRpc2FibGVkIGR1ZSB0byBhbiBodG14IHJlcXVlc3RcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICdbZGF0YS1kaXNhYmxlZC1ieS1odG14XScpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgfSlcbiAgICByZXR1cm4gY2xvbmUuaW5uZXJIVE1MXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKSB7XG4gICAgY29uc3QgZWx0ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50UGF0aEZvckhpc3RvcnkgfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAgIC8vIEFsbG93IGhpc3Rvcnkgc25hcHNob3QgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCB3aGVyZSBoeC1oaXN0b3J5PVwiZmFsc2VcIlxuICAgIC8vIGlzIHByZXNlbnQgKmFueXdoZXJlKiBpbiB0aGUgY3VycmVudCBkb2N1bWVudCB3ZSdyZSBhYm91dCB0byBzYXZlLFxuICAgIC8vIHNvIHdlIGNhbiBwcmV2ZW50IHByaXZpbGVnZWQgZGF0YSBlbnRlcmluZyB0aGUgY2FjaGUuXG4gICAgLy8gVGhlIHBhZ2Ugd2lsbCBzdGlsbCBiZSByZWFjaGFibGUgYXMgYSBoaXN0b3J5IGVudHJ5LCBidXQgaHRteCB3aWxsIGZldGNoIGl0XG4gICAgLy8gbGl2ZSBmcm9tIHRoZSBzZXJ2ZXIgb25wb3BzdGF0ZSByYXRoZXIgdGhhbiBsb29rIGluIHRoZSBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICBsZXQgZGlzYWJsZUhpc3RvcnlDYWNoZVxuICAgIHRyeSB7XG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0nKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJRTExOiBpbnNlbnNpdGl2ZSBtb2RpZmllciBub3Qgc3VwcG9ydGVkIHNvIGZhbGxiYWNrIHRvIGNhc2Ugc2Vuc2l0aXZlIHNlbGVjdG9yXG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCJdLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiXScpXG4gICAgfVxuICAgIGlmICghZGlzYWJsZUhpc3RvcnlDYWNoZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVNhdmUnLCB7IHBhdGgsIGhpc3RvcnlFbHQ6IGVsdCB9KVxuICAgICAgc2F2ZVRvSGlzdG9yeUNhY2hlKHBhdGgsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCBnZXREb2N1bWVudCgpLnRpdGxlLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcHVzaFVybEludG9IaXN0b3J5KHBhdGgpIHtcbiAgLy8gcmVtb3ZlIHRoZSBjYWNoZSBidXN0ZXIgcGFyYW1ldGVyLCBpZiBhbnlcbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvb3JnXFwuaHRteFxcLmNhY2hlLWJ1c3Rlcj1bXiZdKiY/LywgJycpXG4gICAgICBpZiAoZW5kc1dpdGgocGF0aCwgJyYnKSB8fCBlbmRzV2l0aChwYXRoLCAnPycpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIHtcbiAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICB9XG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlVXJsSW5IaXN0b3J5KHBhdGgpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0dGxlSW1tZWRpYXRlbHkodGFza3MpIHtcbiAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICB0YXNrLmNhbGwodW5kZWZpbmVkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgY29uc3QgZGV0YWlscyA9IHsgcGF0aCwgeGhyOiByZXF1ZXN0IH1cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzJywgZGV0YWlscylcbiAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1DdXJyZW50LVVSTCcsIGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZilcbiAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZCcsIGRldGFpbHMpXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KHRoaXMucmVzcG9uc2UpXG4gICAgICAgIC8qKiBAdHlwZSBQYXJlbnROb2RlICovXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpIHx8IGZyYWdtZW50XG4gICAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuXG4gICAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGNvbnRlbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGNhY2hlTWlzczogdHJ1ZSwgc2VydmVyUmVzcG9uc2U6IHRoaXMucmVzcG9uc2UgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWRFcnJvcicsIGRldGFpbHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3Quc2VuZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzdG9yZUhpc3RvcnkocGF0aCkge1xuICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgcGF0aCA9IHBhdGggfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRIaXN0b3J5KHBhdGgpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY2FjaGVkLmNvbnRlbnQpXG4gICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGNhY2hlZC5zY3JvbGwpXG4gICAgICB9LCAwKSAvLyBuZXh0ICd0aWNrJywgc28gYnJvd3NlciBoYXMgdGltZSB0byByZW5kZXIgbGF5b3V0XG4gICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgaXRlbTogY2FjaGVkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5yZWZyZXNoT25IaXN0b3J5TWlzcykge1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gcmVsb2FkKCkgZnVuY3Rpb24gdGhyb3dzIGVycm9yXG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpIHtcbiAgICBsZXQgaW5kaWNhdG9ycyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluZGljYXRvcicpKVxuICAgIGlmIChpbmRpY2F0b3JzID09IG51bGwpIHtcbiAgICAgIGluZGljYXRvcnMgPSBbZWx0XVxuICAgIH1cbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBpYy5jbGFzc0xpc3QuYWRkLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgfSlcbiAgICByZXR1cm4gaW5kaWNhdG9yc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBkaXNhYmxlRWxlbWVudHMoZWx0KSB7XG4gICAgbGV0IGRpc2FibGVkRWx0cyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWRpc2FibGVkLWVsdCcpKVxuICAgIGlmIChkaXNhYmxlZEVsdHMgPT0gbnVsbCkge1xuICAgICAgZGlzYWJsZWRFbHRzID0gW11cbiAgICB9XG4gICAgZm9yRWFjaChkaXNhYmxlZEVsdHMsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnLCAnJylcbiAgICB9KVxuICAgIHJldHVybiBkaXNhYmxlZEVsdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gaW5kaWNhdG9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVkKSB7XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgaWMuY2xhc3NMaXN0LnJlbW92ZS5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChkaXNhYmxlZCwgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnB1dCBWYWx1ZSBQcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IHByb2Nlc3NlZFtpXVxuICAgICAgaWYgKG5vZGUuaXNTYW1lTm9kZShlbHQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkSW5jbHVkZShlbGVtZW50KSB7XG4gICAgLy8gQ2FzdCB0byB0cmljayB0c2MsIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCB3b3JrIGZpbmUgaGVyZVxuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudH0gKi8gKGVsZW1lbnQpXG4gICAgaWYgKGVsdC5uYW1lID09PSAnJyB8fCBlbHQubmFtZSA9PSBudWxsIHx8IGVsdC5kaXNhYmxlZCB8fCBjbG9zZXN0KGVsdCwgJ2ZpZWxkc2V0W2Rpc2FibGVkXScpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgLy8gaWdub3JlIFwic3VibWl0dGVyXCIgdHlwZXMgKHNlZSBqUXVlcnkgc3JjL3NlcmlhbGl6ZS5qcylcbiAgICBpZiAoZWx0LnR5cGUgPT09ICdidXR0b24nIHx8IGVsdC50eXBlID09PSAnc3VibWl0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ltYWdlJyB8fCBlbHQudGFnTmFtZSA9PT0gJ3Jlc2V0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGVsdC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsdC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm4gZWx0LmNoZWNrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheXxGb3JtRGF0YUVudHJ5VmFsdWV9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxldCB2YWx1ZXMgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdmFsdWUuaW5kZXhPZih2KSA8IDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpXG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgIGZvckVhY2godmFsdWVzLCB2ID0+IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudHxIVE1MU2VsZWN0RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpIHtcbiAgICBpZiAoZWx0ID09IG51bGwgfHwgaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NlZC5wdXNoKGVsdClcbiAgICB9XG4gICAgaWYgKHNob3VsZEluY2x1ZGUoZWx0KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJylcbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgbGV0IHZhbHVlID0gZWx0LnZhbHVlXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgZWx0Lm11bHRpcGxlKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uOmNoZWNrZWQnKSkubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuICgvKiogQHR5cGUgSFRNTE9wdGlvbkVsZW1lbnQgKi8oZSkpLnZhbHVlIH0pXG4gICAgICB9XG4gICAgICAvLyBpbmNsdWRlIGZpbGUgaW5wdXRzXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbHQuZmlsZXMpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5maWxlcylcbiAgICAgIH1cbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGVsdC5lbGVtZW50cywgZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHByb2Nlc3NlZC5pbmRleE9mKGlucHV0KSA+PSAwKSB7XG4gICAgICAgICAgLy8gVGhlIGlucHV0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZCBhZGRlZCB0byB0aGUgdmFsdWVzLCBidXQgdGhlIEZvcm1EYXRhIHRoYXQgd2lsbCBiZVxuICAgICAgICAgIC8vICBjb25zdHJ1Y3RlZCByaWdodCBhZnRlciBvbiB0aGUgZm9ybSwgd2lsbCBpbmNsdWRlIGl0IG9uY2UgYWdhaW4uIFNvIHJlbW92ZSB0aGF0IGlucHV0J3MgdmFsdWVcbiAgICAgICAgICAvLyAgbm93IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShpbnB1dC5uYW1lLCBpbnB1dC52YWx1ZSwgZm9ybURhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1c2goaW5wdXQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgICAgdmFsaWRhdGVFbGVtZW50KGlucHV0LCBlcnJvcnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBuZXcgRm9ybURhdGEoZWx0KS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgJiYgdmFsdWUubmFtZSA9PT0gJycpIHtcbiAgICAgICAgICByZXR1cm4gLy8gaWdub3JlIG5vLW5hbWUgZmlsZXNcbiAgICAgICAgfVxuICAgICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICovXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50ICYgRWxlbWVudEludGVybmFsc30gKi8gKGVsdClcbiAgICBpZiAoZWxlbWVudC53aWxsVmFsaWRhdGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOnZhbGlkYXRlJylcbiAgICAgIGlmICghZWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBlbHQ6IGVsZW1lbnQsIG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOmZhaWxlZCcsIHsgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBvbmUgRm9ybURhdGEgd2l0aCB0aG9zZSBmcm9tIGFub3RoZXIuXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IHJlY2VpdmVyIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBkb25vciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIG92ZXJyaWRpbmcgdmFsdWVzXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX0gdGhlIHtAbGlua2NvZGUgcmVjZWl2ZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvdmVycmlkZUZvcm1EYXRhKHJlY2VpdmVyLCBkb25vcikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGRvbm9yLmtleXMoKSkge1xuICAgICAgcmVjZWl2ZXIuZGVsZXRlKGtleSlcbiAgICB9XG4gICAgZG9ub3IuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZWNlaXZlci5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZWNlaXZlclxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEByZXR1cm5zIHt7ZXJyb3JzOiBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdLCBmb3JtRGF0YTogRm9ybURhdGEsIHZhbHVlczogT2JqZWN0fX1cbiAqL1xuICBmdW5jdGlvbiBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpIHtcbiAgICAvKiogQHR5cGUgRWxlbWVudFtdICovXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gW11cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgY29uc3QgcHJpb3JpdHlGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgLyoqIEB0eXBlIEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCAmJiAhYm9keUNvbnRhaW5zKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBvbmx5IHZhbGlkYXRlIHdoZW4gZm9ybSBpcyBkaXJlY3RseSBzdWJtaXR0ZWQgYW5kIG5vdmFsaWRhdGUgb3IgZm9ybW5vdmFsaWRhdGUgYXJlIG5vdCBzZXRcbiAgICAvLyBvciBpZiB0aGUgZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgaHgtdmFsaWRhdGU9XCJ0cnVlXCIgb24gaXRcbiAgICBsZXQgdmFsaWRhdGUgPSAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmIGVsdC5ub1ZhbGlkYXRlICE9PSB0cnVlKSB8fCBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC12YWxpZGF0ZScpID09PSAndHJ1ZSdcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSB7XG4gICAgICB2YWxpZGF0ZSA9IHZhbGlkYXRlICYmIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZC5mb3JtTm9WYWxpZGF0ZSAhPT0gdHJ1ZVxuICAgIH1cblxuICAgIC8vIGZvciBhIG5vbi1HRVQgaW5jbHVkZSB0aGUgY2xvc2VzdCBmb3JtXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIHByaW9yaXR5Rm9ybURhdGEsIGVycm9ycywgY2xvc2VzdChlbHQsICdmb3JtJyksIHZhbGlkYXRlKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKVxuXG4gICAgLy8gaWYgYSBidXR0b24gb3Igc3VibWl0IHdhcyBjbGlja2VkIGxhc3QsIGluY2x1ZGUgaXRzIHZhbHVlXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCBlbHQudGFnTmFtZSA9PT0gJ0JVVFRPTicgfHxcbiAgICAoZWx0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcpKSB7XG4gICAgICBjb25zdCBidXR0b24gPSBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgKC8qKiBAdHlwZSBIVE1MSW5wdXRFbGVtZW50fEhUTUxCdXR0b25FbGVtZW50ICovKGVsdCkpXG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGJ1dHRvbiwgJ25hbWUnKVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIGJ1dHRvbi52YWx1ZSwgcHJpb3JpdHlGb3JtRGF0YSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIGFueSBleHBsaWNpdCBpbmNsdWRlc1xuICAgIGNvbnN0IGluY2x1ZGVzID0gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5jbHVkZScpXG4gICAgZm9yRWFjaChpbmNsdWRlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBhc0VsZW1lbnQobm9kZSksIHZhbGlkYXRlKVxuICAgICAgLy8gaWYgYSBub24tZm9ybSBpcyBpbmNsdWRlZCwgaW5jbHVkZSBhbnkgaW5wdXQgdmFsdWVzIHdpdGhpbiBpdFxuICAgICAgaWYgKCFtYXRjaGVzKG5vZGUsICdmb3JtJykpIHtcbiAgICAgICAgZm9yRWFjaChhc1BhcmVudE5vZGUobm9kZSkucXVlcnlTZWxlY3RvckFsbChJTlBVVF9TRUxFQ1RPUiksIGZ1bmN0aW9uKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGRlc2NlbmRhbnQsIHZhbGlkYXRlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyB2YWx1ZXMgZnJvbSBhIDxmb3JtPiB0YWtlIHByZWNlZGVuY2UsIG92ZXJyaWRpbmcgdGhlIHJlZ3VsYXIgdmFsdWVzXG4gICAgb3ZlcnJpZGVGb3JtRGF0YShmb3JtRGF0YSwgcHJpb3JpdHlGb3JtRGF0YSlcblxuICAgIHJldHVybiB7IGVycm9ycywgZm9ybURhdGEsIHZhbHVlczogZm9ybURhdGFQcm94eShmb3JtRGF0YSkgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXR1cm5TdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHthbnl9IHJlYWxWYWx1ZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBuYW1lLCByZWFsVmFsdWUpIHtcbiAgICBpZiAocmV0dXJuU3RyICE9PSAnJykge1xuICAgICAgcmV0dXJuU3RyICs9ICcmJ1xuICAgIH1cbiAgICBpZiAoU3RyaW5nKHJlYWxWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZWFsVmFsdWUgPSBKU09OLnN0cmluZ2lmeShyZWFsVmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IHMgPSBlbmNvZGVVUklDb21wb25lbnQocmVhbFZhbHVlKVxuICAgIHJldHVyblN0ciArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBzXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF8T2JqZWN0fSB2YWx1ZXNcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBmdW5jdGlvbiB1cmxFbmNvZGUodmFsdWVzKSB7XG4gICAgdmFsdWVzID0gZm9ybURhdGFGcm9tT2JqZWN0KHZhbHVlcylcbiAgICBsZXQgcmV0dXJuU3RyID0gJydcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm5TdHIgPSBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBamF4XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9tcHRcbiAqIEByZXR1cm5zIHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHQpIHtcbiAgICAvKiogQHR5cGUgSHRteEhlYWRlclNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgJ0hYLVJlcXVlc3QnOiAndHJ1ZScsXG4gICAgICAnSFgtVHJpZ2dlcic6IGdldFJhd0F0dHJpYnV0ZShlbHQsICdpZCcpLFxuICAgICAgJ0hYLVRyaWdnZXItTmFtZSc6IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJyksXG4gICAgICAnSFgtVGFyZ2V0JzogZ2V0QXR0cmlidXRlVmFsdWUodGFyZ2V0LCAnaWQnKSxcbiAgICAgICdIWC1DdXJyZW50LVVSTCc6IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cbiAgICBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LWhlYWRlcnMnLCBmYWxzZSwgaGVhZGVycylcbiAgICBpZiAocHJvbXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLVByb21wdCddID0gcHJvbXB0XG4gICAgfVxuICAgIGlmIChnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Cb29zdGVkJ10gPSAndHJ1ZSdcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIC8qKlxuICogZmlsdGVyVmFsdWVzIHRha2VzIGFuIG9iamVjdCBjb250YWluaW5nIGZvcm0gaW5wdXQgdmFsdWVzXG4gKiBhbmQgcmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBvbmx5IGNvbnRhaW5zIGtleXMgdGhhdCBhcmVcbiAqIHNwZWNpZmllZCBieSB0aGUgY2xvc2VzdCBcImh4LXBhcmFtc1wiIGF0dHJpYnV0ZVxuICogQHBhcmFtIHtGb3JtRGF0YX0gaW5wdXRWYWx1ZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZmlsdGVyVmFsdWVzKGlucHV0VmFsdWVzLCBlbHQpIHtcbiAgICBjb25zdCBwYXJhbXNWYWx1ZSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wYXJhbXMnKVxuICAgIGlmIChwYXJhbXNWYWx1ZSkge1xuICAgICAgaWYgKHBhcmFtc1ZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlLmluZGV4T2YoJ25vdCAnKSA9PT0gMCkge1xuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnN1YnN0cig0KS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaW5wdXRWYWx1ZXMuZGVsZXRlKG5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaWYgKGlucHV0VmFsdWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZXMuZ2V0QWxsKG5hbWUpLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHsgbmV3VmFsdWVzLmFwcGVuZChuYW1lLCB2YWx1ZSkgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBuZXdWYWx1ZXNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0FuY2hvckxpbmsoZWx0KSB7XG4gICAgcmV0dXJuICEhZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSA+PSAwXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IFtzd2FwSW5mb092ZXJyaWRlXVxuICogQHJldHVybnMge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBJbmZvT3ZlcnJpZGUpIHtcbiAgICBjb25zdCBzd2FwSW5mbyA9IHN3YXBJbmZvT3ZlcnJpZGUgfHwgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN3YXAnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBzd2FwU3BlYyA9IHtcbiAgICAgIHN3YXBTdHlsZTogZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCA/ICdpbm5lckhUTUwnIDogaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSxcbiAgICAgIHN3YXBEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFN3YXBEZWxheSxcbiAgICAgIHNldHRsZURlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U2V0dGxlRGVsYXlcbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLnNjcm9sbEludG9WaWV3T25Cb29zdCAmJiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmICFpc0FuY2hvckxpbmsoZWx0KSkge1xuICAgICAgc3dhcFNwZWMuc2hvdyA9ICd0b3AnXG4gICAgfVxuICAgIGlmIChzd2FwSW5mbykge1xuICAgICAgY29uc3Qgc3BsaXQgPSBzcGxpdE9uV2hpdGVzcGFjZShzd2FwSW5mbylcbiAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNwbGl0W2ldXG4gICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ3N3YXA6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDUpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2V0dGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zZXR0bGVEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDcpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZigndHJhbnNpdGlvbjonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMudHJhbnNpdGlvbiA9IHZhbHVlLnN1YnN0cigxMSkgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignaWdub3JlVGl0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gdmFsdWUuc3Vic3RyKDEyKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFNwZWMgPSB2YWx1ZS5zdWJzdHIoNylcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzY3JvbGxTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsID0gc2Nyb2xsVmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGxUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2hvdzonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2hvd1NwZWMgPSB2YWx1ZS5zdWJzdHIoNSlcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzaG93U3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzaG93VmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93ID0gc2hvd1ZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvd1RhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdmb2N1cy1zY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzU2Nyb2xsVmFsID0gdmFsdWUuc3Vic3RyKCdmb2N1cy1zY3JvbGw6Jy5sZW5ndGgpXG4gICAgICAgICAgICBzd2FwU3BlYy5mb2N1c1Njcm9sbCA9IGZvY3VzU2Nyb2xsVmFsID09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwU3R5bGUgPSB2YWx1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dFcnJvcignVW5rbm93biBtb2RpZmllciBpbiBoeC1zd2FwOiAnICsgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3BlY1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB1c2VzRm9ybURhdGEoZWx0KSB7XG4gICAgcmV0dXJuIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1lbmNvZGluZycpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfHxcbiAgICAobWF0Y2hlcyhlbHQsICdmb3JtJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2VuY3R5cGUnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmaWx0ZXJlZFBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgeyp8c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZFBhcmFtZXRlcnMpIHtcbiAgICBsZXQgZW5jb2RlZFBhcmFtZXRlcnMgPSBudWxsXG4gICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyA9PSBudWxsKSB7XG4gICAgICAgIGVuY29kZWRQYXJhbWV0ZXJzID0gZXh0ZW5zaW9uLmVuY29kZVBhcmFtZXRlcnMoeGhyLCBmaWx0ZXJlZFBhcmFtZXRlcnMsIGVsdClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5jb2RlZFBhcmFtZXRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbnZlcnNpb24gdG8gYW4gYWN0dWFsIEZvcm1EYXRhIG9iamVjdCBpbiBjYXNlIGZpbHRlcmVkUGFyYW1ldGVycyBpcyBhIGZvcm1EYXRhUHJveHlcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14L2lzc3Vlcy8yMzE3XG4gICAgICAgIHJldHVybiBvdmVycmlkZUZvcm1EYXRhKG5ldyBGb3JtRGF0YSgpLCBmb3JtRGF0YUZyb21PYmplY3QoZmlsdGVyZWRQYXJhbWV0ZXJzKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmxFbmNvZGUoZmlsdGVyZWRQYXJhbWV0ZXJzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7SHRteFNldHRsZUluZm99XG4gKi9cbiAgZnVuY3Rpb24gbWFrZVNldHRsZUluZm8odGFyZ2V0KSB7XG4gICAgcmV0dXJuIHsgdGFza3M6IFtdLCBlbHRzOiBbdGFyZ2V0XSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxTdGF0ZShjb250ZW50LCBzd2FwU3BlYykge1xuICAgIGNvbnN0IGZpcnN0ID0gY29udGVudFswXVxuICAgIGNvbnN0IGxhc3QgPSBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV1cbiAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbFRhcmdldCkge1xuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gMFxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gdGFyZ2V0LnNjcm9sbEhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3dhcFNwZWMuc2hvdykge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0KSB7XG4gICAgICAgIGxldCB0YXJnZXRTdHIgPSBzd2FwU3BlYy5zaG93VGFyZ2V0XG4gICAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0ID09PSAnd2luZG93Jykge1xuICAgICAgICAgIHRhcmdldFN0ciA9ICdib2R5J1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCB0YXJnZXRTdHIpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBldmFsQXNEZWZhdWx0XG4gKiBAcGFyYW0ge09iamVjdD19IHZhbHVlc1xuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICB2YWx1ZXMgPSB7fVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZXNcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgICBsZXQgc3RyID0gYXR0cmlidXRlVmFsdWUudHJpbSgpXG4gICAgICBsZXQgZXZhbHVhdGVWYWx1ZSA9IGV2YWxBc0RlZmF1bHRcbiAgICAgIGlmIChzdHIgPT09ICd1bnNldCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDExKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdHIuaW5kZXhPZignanM6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigzKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCd7JykgIT09IDApIHtcbiAgICAgICAgc3RyID0gJ3snICsgc3RyICsgJ30nXG4gICAgICB9XG4gICAgICBsZXQgdmFyc1ZhbHVlc1xuICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkgeyByZXR1cm4gRnVuY3Rpb24oJ3JldHVybiAoJyArIHN0ciArICcpJykoKSB9LCB7fSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBwYXJzZUpTT04oc3RyKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFyc1ZhbHVlcykge1xuICAgICAgICBpZiAodmFyc1ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gdmFyc1ZhbHVlc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7KCkgPT4gYW55fSB0b0V2YWxcbiAgICogQHBhcmFtIHthbnk9fSBkZWZhdWx0VmFsXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUV2YWwoZWx0LCB0b0V2YWwsIGRlZmF1bHRWYWwpIHtcbiAgICBpZiAoaHRteC5jb25maWcuYWxsb3dFdmFsKSB7XG4gICAgICByZXR1cm4gdG9FdmFsKClcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpldmFsRGlzYWxsb3dlZEVycm9yJylcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFycycsIHRydWUsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFscycsIGZhbHNlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBnZXRFeHByZXNzaW9uVmFycyhlbHQpIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3RzKGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0KSwgZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGhlYWRlclZhbHVlXG4gICAqL1xuICBmdW5jdGlvbiBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpIHtcbiAgICBpZiAoaGVhZGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBPbiBhbiBleGNlcHRpb24sIHRyeSB0byBzZXQgdGhlIGhlYWRlciBVUkkgZW5jb2RlZCBpbnN0ZWFkXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgZW5jb2RlVVJJQ29tcG9uZW50KGhlYWRlclZhbHVlKSlcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyICsgJy1VUkktQXV0b0VuY29kZWQnLCAndHJ1ZScpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocikge1xuICAvLyBOQjogSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgc3R1ZmZcbiAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICYmIHR5cGVvZiAoVVJMKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoeGhyLnJlc3BvbnNlVVJMKVxuICAgICAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJhZFJlc3BvbnNlVXJsJywgeyB1cmw6IHhoci5yZXNwb25zZVVSTCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzSGVhZGVyKHhociwgcmVnZXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cC50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZXMgYW4gaHRteC1zdHlsZSBBSkFYIHJlcXVlc3RcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWpheFxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBVUkwgcGF0aCB0byBtYWtlIHRoZSBBSkFYXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd8SHRteEFqYXhIZWxwZXJDb250ZXh0fSBjb250ZXh0IHRoZSBlbGVtZW50IHRvIHRhcmdldCAoZGVmYXVsdHMgdG8gdGhlICoqYm9keSoqKSB8IGEgc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgfCBhIGNvbnRleHQgb2JqZWN0IHRoYXQgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmdcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5IGlmIG5vIHJlcXVlc3QgaXMgc2VudCwgb3Igd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgZnVuY3Rpb24gYWpheEhlbHBlcih2ZXJiLCBwYXRoLCBjb250ZXh0KSB7XG4gICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8odmVyYi50b0xvd2VyQ2FzZSgpKSlcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dCksXG4gICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgcmVzb2x2ZVRhcmdldChjb250ZXh0LnNvdXJjZSksIGNvbnRleHQuZXZlbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGFuZGxlcjogY29udGV4dC5oYW5kbGVyLFxuICAgICAgICAgICAgaGVhZGVyczogY29udGV4dC5oZWFkZXJzLFxuICAgICAgICAgICAgdmFsdWVzOiBjb250ZXh0LnZhbHVlcyxcbiAgICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQudGFyZ2V0KSxcbiAgICAgICAgICAgIHN3YXBPdmVycmlkZTogY29udGV4dC5zd2FwLFxuICAgICAgICAgICAgc2VsZWN0OiBjb250ZXh0LnNlbGVjdCxcbiAgICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGhpZXJhcmNoeUZvckVsdChlbHQpIHtcbiAgICBjb25zdCBhcnIgPSBbXVxuICAgIHdoaWxlIChlbHQpIHtcbiAgICAgIGFyci5wdXNoKGVsdClcbiAgICAgIGVsdCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB2ZXJpZnlQYXRoKGVsdCwgcGF0aCwgcmVxdWVzdENvbmZpZykge1xuICAgIGxldCBzYW1lSG9zdFxuICAgIGxldCB1cmxcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXJsID0gbmV3IFVSTChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKVxuICAgICAgY29uc3Qgb3JpZ2luID0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgICBzYW1lSG9zdCA9IG9yaWdpbiA9PT0gdXJsLm9yaWdpblxuICAgIH0gZWxzZSB7XG4gICAgLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgVVJMXG4gICAgICB1cmwgPSBwYXRoXG4gICAgICBzYW1lSG9zdCA9IHN0YXJ0c1dpdGgocGF0aCwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5zZWxmUmVxdWVzdHNPbmx5KSB7XG4gICAgICBpZiAoIXNhbWVIb3N0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGVVcmwnLCBtZXJnZU9iamVjdHMoeyB1cmwsIHNhbWVIb3N0IH0sIHJlcXVlc3RDb25maWcpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZvcm1EYXRhfSBvYmpcbiAgICogQHJldHVybiB7Rm9ybURhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvcm1EYXRhKSByZXR1cm4gb2JqXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0uZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9ialtrZXldLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgIShvYmpba2V5XSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgSlNPTi5zdHJpbmdpZnkob2JqW2tleV0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhQXJyYXlQcm94eShmb3JtRGF0YSwgbmFtZSwgYXJyYXkpIHtcbiAgICAvLyBtdXRhdGluZyB0aGUgYXJyYXkgc2hvdWxkIG11dGF0ZSB0aGUgdW5kZXJseWluZyBmb3JtIGRhdGFcbiAgICByZXR1cm4gbmV3IFByb3h5KGFycmF5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIGlmIChrZXkgPT09ICdsZW5ndGgnKSByZXR1cm4gdGFyZ2V0Lmxlbmd0aFxuICAgICAgICBpZiAoa2V5ID09PSAncHVzaCcpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpXG4gICAgICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldFtrZXldICYmIHRhcmdldFtrZXldLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFQcm94eShmb3JtRGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZm9ybURhdGEsIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHN5bWJvbCBjYWxscyB0byB0aGUgRm9ybURhdGEgaXRzZWxmIGRpcmVjdGx5XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgbmFtZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ3RvSlNPTicpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IEpTT04uc3RyaW5naWZ5IGNhbGwgb24gcHJveHlcbiAgICAgICAgICByZXR1cm4gKCkgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lIGluIHRhcmdldCkge1xuICAgICAgICAgIC8vIFdyYXAgaW4gZnVuY3Rpb24gd2l0aCBhcHBseSB0byBjb3JyZWN0bHkgYmluZCB0aGUgRm9ybURhdGEgY29udGV4dCwgYXMgYSBkaXJlY3QgY2FsbCB3b3VsZCByZXN1bHQgaW4gYW4gaWxsZWdhbCBpbnZvY2F0aW9uIGVycm9yXG4gICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcm1EYXRhW25hbWVdLmFwcGx5KGZvcm1EYXRhLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXkgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgICAgLy8gVGhvc2UgMiB1bmRlZmluZWQgJiBzaW5nbGUgdmFsdWUgcmV0dXJucyBhcmUgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkgYXMgd2Ugd2VyZW4ndCB1c2luZyBGb3JtRGF0YSBiZWZvcmVcbiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gYXJyYXlbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZm9ybURhdGFBcnJheVByb3h5KHRhcmdldCwgbmFtZSwgYXJyYXkpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IHRhcmdldC5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEodmFsdWUgaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICAvLyBTdXBwb3J0IE9iamVjdC5hc3NpZ24gY2FsbCBmcm9tIHByb3h5XG4gICAgICBvd25LZXlzOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSlcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRhcmdldCwgcHJvcCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCksIHByb3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7SHRteEFqYXhFdGN9IFtldGNdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmZpcm1lZF1cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCBjb25maXJtZWQpIHtcbiAgICBsZXQgcmVzb2x2ZSA9IG51bGxcbiAgICBsZXQgcmVqZWN0ID0gbnVsbFxuICAgIGV0YyA9IGV0YyAhPSBudWxsID8gZXRjIDoge31cbiAgICBpZiAoZXRjLnJldHVyblByb21pc2UgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICByZWplY3QgPSBfcmVqZWN0XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIGVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZUhhbmRsZXIgPSBldGMuaGFuZGxlciB8fCBoYW5kbGVBamF4UmVzcG9uc2VcbiAgICBjb25zdCBzZWxlY3QgPSBldGMuc2VsZWN0IHx8IG51bGxcblxuICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAvLyBkbyBub3QgaXNzdWUgcmVxdWVzdHMgZm9yIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV0Yy50YXJnZXRPdmVycmlkZSB8fCBhc0VsZW1lbnQoZ2V0VGFyZ2V0KGVsdCkpXG4gICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IHRhcmdldCA9PSBEVU1NWV9FTFQpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGFyZ2V0RXJyb3InLCB7IHRhcmdldDogZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JykgfSlcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGxldCBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBjb25zdCBzdWJtaXR0ZXIgPSBlbHREYXRhLmxhc3RCdXR0b25DbGlja2VkXG5cbiAgICBpZiAoc3VibWl0dGVyKSB7XG4gICAgICBjb25zdCBidXR0b25QYXRoID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1hY3Rpb24nKVxuICAgICAgaWYgKGJ1dHRvblBhdGggIT0gbnVsbCkge1xuICAgICAgICBwYXRoID0gYnV0dG9uUGF0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25WZXJiID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1tZXRob2QnKVxuICAgICAgaWYgKGJ1dHRvblZlcmIgIT0gbnVsbCkge1xuICAgICAgLy8gaWdub3JlIGJ1dHRvbnMgd2l0aCBmb3JtbWV0aG9kPVwiZGlhbG9nXCJcbiAgICAgICAgaWYgKGJ1dHRvblZlcmIudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyhidXR0b25WZXJiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm1RdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1jb25maXJtJylcbiAgICAvLyBhbGxvdyBldmVudC1iYXNlZCBjb25maXJtYXRpb24gdy8gYSBjYWxsYmFja1xuICAgIGlmIChjb25maXJtZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNzdWVSZXF1ZXN0ID0gZnVuY3Rpb24oc2tpcENvbmZpcm1hdGlvbikge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsICEhc2tpcENvbmZpcm1hdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpcm1EZXRhaWxzID0geyB0YXJnZXQsIGVsdCwgcGF0aCwgdmVyYiwgdHJpZ2dlcmluZ0V2ZW50OiBldmVudCwgZXRjLCBpc3N1ZVJlcXVlc3QsIHF1ZXN0aW9uOiBjb25maXJtUXVlc3Rpb24gfVxuICAgICAgaWYgKHRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpcm0nLCBjb25maXJtRGV0YWlscykgPT09IGZhbHNlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzeW5jRWx0ID0gZWx0XG4gICAgbGV0IHN5bmNTdHJhdGVneSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zeW5jJylcbiAgICBsZXQgcXVldWVTdHJhdGVneSA9IG51bGxcbiAgICBsZXQgYWJvcnRhYmxlID0gZmFsc2VcbiAgICBpZiAoc3luY1N0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBzeW5jU3RyaW5ncyA9IHN5bmNTdHJhdGVneS5zcGxpdCgnOicpXG4gICAgICBjb25zdCBzZWxlY3RvciA9IHN5bmNTdHJpbmdzWzBdLnRyaW0oKVxuICAgICAgaWYgKHNlbGVjdG9yID09PSAndGhpcycpIHtcbiAgICAgICAgc3luY0VsdCA9IGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC1zeW5jJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN5bmNFbHQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHNlbGVjdG9yKSlcbiAgICAgIH1cbiAgICAgIC8vIGRlZmF1bHQgdG8gdGhlIGRyb3Agc3RyYXRlZ3lcbiAgICAgIHN5bmNTdHJhdGVneSA9IChzeW5jU3RyaW5nc1sxXSB8fCAnZHJvcCcpLnRyaW0oKVxuICAgICAgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShzeW5jRWx0KVxuICAgICAgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Ryb3AnICYmIGVsdERhdGEueGhyICYmIGVsdERhdGEuYWJvcnRhYmxlICE9PSB0cnVlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdhYm9ydCcpIHtcbiAgICAgICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhYm9ydGFibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAncmVwbGFjZScpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5LmluZGV4T2YoJ3F1ZXVlJykgPT09IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVTdHJBcnJheSA9IHN5bmNTdHJhdGVneS5zcGxpdCgnICcpXG4gICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAocXVldWVTdHJBcnJheVsxXSB8fCAnbGFzdCcpLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgaWYgKGVsdERhdGEuYWJvcnRhYmxlKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZlbnQpXG4gICAgICAgICAgICBpZiAoZXZlbnREYXRhICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyAmJiBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWUpIHtcbiAgICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9IGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gJ2xhc3QnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID09IG51bGwpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2ZpcnN0JyAmJiBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdsYXN0Jykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXSAvLyBkdW1wIGV4aXN0aW5nIHF1ZXVlXG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGVsdERhdGEueGhyID0geGhyXG4gICAgZWx0RGF0YS5hYm9ydGFibGUgPSBhYm9ydGFibGVcbiAgICBjb25zdCBlbmRSZXF1ZXN0TG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWx0RGF0YS54aHIgPSBudWxsXG4gICAgICBlbHREYXRhLmFib3J0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyAhPSBudWxsICYmXG4gICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVkUmVxdWVzdCA9IGVsdERhdGEucXVldWVkUmVxdWVzdHMuc2hpZnQoKVxuICAgICAgICBxdWV1ZWRSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvbXB0UXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHJvbXB0JylcbiAgICBpZiAocHJvbXB0UXVlc3Rpb24pIHtcbiAgICAgIHZhciBwcm9tcHRSZXNwb25zZSA9IHByb21wdChwcm9tcHRRdWVzdGlvbilcbiAgICAgIC8vIHByb21wdCByZXR1cm5zIG51bGwgaWYgY2FuY2VsbGVkIGFuZCBlbXB0eSBzdHJpbmcgaWYgYWNjZXB0ZWQgd2l0aCBubyBlbnRyeVxuICAgICAgaWYgKHByb21wdFJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgICAhdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cHJvbXB0JywgeyBwcm9tcHQ6IHByb21wdFJlc3BvbnNlLCB0YXJnZXQgfSkpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybVF1ZXN0aW9uICYmICFjb25maXJtZWQpIHtcbiAgICAgIGlmICghY29uZmlybShjb25maXJtUXVlc3Rpb24pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHRSZXNwb25zZSlcblxuICAgIGlmICh2ZXJiICE9PSAnZ2V0JyAmJiAhdXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICB9XG5cbiAgICBpZiAoZXRjLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMgPSBtZXJnZU9iamVjdHMoaGVhZGVycywgZXRjLmhlYWRlcnMpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpXG4gICAgbGV0IGVycm9ycyA9IHJlc3VsdHMuZXJyb3JzXG4gICAgY29uc3QgcmF3Rm9ybURhdGEgPSByZXN1bHRzLmZvcm1EYXRhXG4gICAgaWYgKGV0Yy52YWx1ZXMpIHtcbiAgICAgIG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGZvcm1EYXRhRnJvbU9iamVjdChldGMudmFsdWVzKSlcbiAgICB9XG4gICAgY29uc3QgZXhwcmVzc2lvblZhcnMgPSBmb3JtRGF0YUZyb21PYmplY3QoZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSlcbiAgICBjb25zdCBhbGxGb3JtRGF0YSA9IG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGV4cHJlc3Npb25WYXJzKVxuICAgIGxldCBmaWx0ZXJlZEZvcm1EYXRhID0gZmlsdGVyVmFsdWVzKGFsbEZvcm1EYXRhLCBlbHQpXG5cbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSAmJiB2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgZmlsdGVyZWRGb3JtRGF0YS5zZXQoJ29yZy5odG14LmNhY2hlLWJ1c3RlcicsIGdldFJhd0F0dHJpYnV0ZSh0YXJnZXQsICdpZCcpIHx8ICd0cnVlJylcbiAgICB9XG5cbiAgICAvLyBiZWhhdmlvciBvZiBhbmNob3JzIHcvIGVtcHR5IGhyZWYgaXMgdG8gdXNlIHRoZSBjdXJyZW50IFVSTFxuICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aCA9PT0gJycpIHtcbiAgICAgIHBhdGggPSBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtub0hlYWRlcnNdXG4gICAgICovXG4gICAgY29uc3QgcmVxdWVzdEF0dHJWYWx1ZXMgPSBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXJlcXVlc3QnKVxuXG4gICAgY29uc3QgZWx0SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHVzZVVybFBhcmFtcyA9IGh0bXguY29uZmlnLm1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zLmluZGV4T2YodmVyYikgPj0gMFxuXG4gICAgLyoqIEB0eXBlIEh0bXhSZXF1ZXN0Q29uZmlnICovXG4gICAgY29uc3QgcmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHVzZVVybFBhcmFtcyxcbiAgICAgIGZvcm1EYXRhOiBmaWx0ZXJlZEZvcm1EYXRhLFxuICAgICAgcGFyYW1ldGVyczogZm9ybURhdGFQcm94eShmaWx0ZXJlZEZvcm1EYXRhKSxcbiAgICAgIHVuZmlsdGVyZWRGb3JtRGF0YTogYWxsRm9ybURhdGEsXG4gICAgICB1bmZpbHRlcmVkUGFyYW1ldGVyczogZm9ybURhdGFQcm94eShhbGxGb3JtRGF0YSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdmVyYixcbiAgICAgIGVycm9ycyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogZXRjLmNyZWRlbnRpYWxzIHx8IHJlcXVlc3RBdHRyVmFsdWVzLmNyZWRlbnRpYWxzIHx8IGh0bXguY29uZmlnLndpdGhDcmVkZW50aWFscyxcbiAgICAgIHRpbWVvdXQ6IGV0Yy50aW1lb3V0IHx8IHJlcXVlc3RBdHRyVmFsdWVzLnRpbWVvdXQgfHwgaHRteC5jb25maWcudGltZW91dCxcbiAgICAgIHBhdGgsXG4gICAgICB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50XG4gICAgfVxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maWdSZXF1ZXN0JywgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICAvLyBjb3B5IG91dCBpbiBjYXNlIHRoZSBvYmplY3Qgd2FzIG92ZXJ3cml0dGVuXG4gICAgcGF0aCA9IHJlcXVlc3RDb25maWcucGF0aFxuICAgIHZlcmIgPSByZXF1ZXN0Q29uZmlnLnZlcmJcbiAgICBoZWFkZXJzID0gcmVxdWVzdENvbmZpZy5oZWFkZXJzXG4gICAgZmlsdGVyZWRGb3JtRGF0YSA9IGZvcm1EYXRhRnJvbU9iamVjdChyZXF1ZXN0Q29uZmlnLnBhcmFtZXRlcnMpXG4gICAgZXJyb3JzID0gcmVxdWVzdENvbmZpZy5lcnJvcnNcbiAgICB1c2VVcmxQYXJhbXMgPSByZXF1ZXN0Q29uZmlnLnVzZVVybFBhcmFtc1xuXG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGlvbjpoYWx0ZWQnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0UGF0aCA9IHBhdGguc3BsaXQoJyMnKVxuICAgIGNvbnN0IHBhdGhOb0FuY2hvciA9IHNwbGl0UGF0aFswXVxuICAgIGNvbnN0IGFuY2hvciA9IHNwbGl0UGF0aFsxXVxuXG4gICAgbGV0IGZpbmFsUGF0aCA9IHBhdGhcbiAgICBpZiAodXNlVXJsUGFyYW1zKSB7XG4gICAgICBmaW5hbFBhdGggPSBwYXRoTm9BbmNob3JcbiAgICAgIGNvbnN0IGhhc1ZhbHVlcyA9ICFmaWx0ZXJlZEZvcm1EYXRhLmtleXMoKS5uZXh0KCkuZG9uZVxuICAgICAgaWYgKGhhc1ZhbHVlcykge1xuICAgICAgICBpZiAoZmluYWxQYXRoLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJz8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcmJ1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsUGF0aCArPSB1cmxFbmNvZGUoZmlsdGVyZWRGb3JtRGF0YSlcbiAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnIycgKyBhbmNob3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdmVyaWZ5UGF0aChlbHQsIGZpbmFsUGF0aCwgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6aW52YWxpZFBhdGgnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgeGhyLm9wZW4odmVyYi50b1VwcGVyQ2FzZSgpLCBmaW5hbFBhdGgsIHRydWUpXG4gICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvaHRtbCcpXG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHJlcXVlc3RDb25maWcud2l0aENyZWRlbnRpYWxzXG4gICAgeGhyLnRpbWVvdXQgPSByZXF1ZXN0Q29uZmlnLnRpbWVvdXRcblxuICAgIC8vIHJlcXVlc3QgaGVhZGVyc1xuICAgIGlmIChyZXF1ZXN0QXR0clZhbHVlcy5ub0hlYWRlcnMpIHtcbiAgICAvLyBpZ25vcmUgYWxsIGhlYWRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlcl1cbiAgICAgICAgICBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0h0bXhSZXNwb25zZUluZm99ICovXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvID0ge1xuICAgICAgeGhyLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcmVxdWVzdENvbmZpZyxcbiAgICAgIGV0YyxcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHNlbGVjdCxcbiAgICAgIHBhdGhJbmZvOiB7XG4gICAgICAgIHJlcXVlc3RQYXRoOiBwYXRoLFxuICAgICAgICBmaW5hbFJlcXVlc3RQYXRoOiBmaW5hbFBhdGgsXG4gICAgICAgIHJlc3BvbnNlUGF0aDogbnVsbCxcbiAgICAgICAgYW5jaG9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGllcmFyY2h5ID0gaGllcmFyY2h5Rm9yRWx0KGVsdClcbiAgICAgICAgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aCA9IGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKVxuICAgICAgICByZXNwb25zZUhhbmRsZXIoZWx0LCByZXNwb25zZUluZm8pXG4gICAgICAgIGlmIChyZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgIT09IHRydWUpIHtcbiAgICAgICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAvLyBpZiB0aGUgYm9keSBubyBsb25nZXIgY29udGFpbnMgdGhlIGVsZW1lbnQsIHRyaWdnZXIgdGhlIGV2ZW50IG9uIHRoZSBjbG9zZXN0IHBhcmVudFxuICAgICAgICAvLyByZW1haW5pbmcgaW4gdGhlIERPTVxuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgbGV0IHNlY29uZGFyeVRyaWdnZXJFbHQgPSBudWxsXG4gICAgICAgICAgd2hpbGUgKGhpZXJhcmNoeS5sZW5ndGggPiAwICYmIHNlY29uZGFyeVRyaWdnZXJFbHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50RWx0SW5IaWVyYXJjaHkgPSBoaWVyYXJjaHkuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKGJvZHlDb250YWlucyhwYXJlbnRFbHRJbkhpZXJhcmNoeSkpIHtcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IHBhcmVudEVsdEluSGllcmFyY2h5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWNvbmRhcnlUcmlnZ2VyRWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14Om9uTG9hZEVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgdGhyb3cgZVxuICAgICAgfVxuICAgIH1cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRBYm9ydCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRpbWVvdXQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVJlcXVlc3QnLCByZXNwb25zZUluZm8pKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIHZhciBpbmRpY2F0b3JzID0gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KVxuICAgIHZhciBkaXNhYmxlRWx0cyA9IGRpc2FibGVFbGVtZW50cyhlbHQpXG5cbiAgICBmb3JFYWNoKFsnbG9hZHN0YXJ0JywgJ2xvYWRlbmQnLCAncHJvZ3Jlc3MnLCAnYWJvcnQnXSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBmb3JFYWNoKFt4aHIsIHhoci51cGxvYWRdLCBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnhocjonICsgZXZlbnROYW1lLCB7XG4gICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudC5sZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogZXZlbnQudG90YWxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVNlbmQnLCByZXNwb25zZUluZm8pXG4gICAgY29uc3QgcGFyYW1zID0gdXNlVXJsUGFyYW1zID8gbnVsbCA6IGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkRm9ybURhdGEpXG4gICAgeGhyLnNlbmQocGFyYW1zKVxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlVcGRhdGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3R5cGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFtwYXRoXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICogQHJldHVybiB7SHRteEhpc3RvcnlVcGRhdGV9XG4gICAqL1xuICBmdW5jdGlvbiBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBGaXJzdCBjb25zdWx0IHJlc3BvbnNlIGhlYWRlcnNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IHBhdGhGcm9tSGVhZGVycyA9IG51bGxcbiAgICBsZXQgdHlwZUZyb21IZWFkZXJzID0gbnVsbFxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaC1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVwbGFjZS1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlcGxhY2UtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdyZXBsYWNlJ1xuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIHdhcyBhIHJlc3BvbnNlIGhlYWRlciwgdGhhdCBoYXMgcHJpb3JpdHlcbiAgICBpZiAocGF0aEZyb21IZWFkZXJzKSB7XG4gICAgICBpZiAocGF0aEZyb21IZWFkZXJzID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0eXBlRnJvbUhlYWRlcnMsXG4gICAgICAgICAgcGF0aDogcGF0aEZyb21IZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTmV4dCByZXNvbHZlIHZpYSBET00gdmFsdWVzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmZpbmFsUmVxdWVzdFBhdGhcbiAgICBjb25zdCByZXNwb25zZVBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoXG5cbiAgICBjb25zdCBwdXNoVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXB1c2gtdXJsJylcbiAgICBjb25zdCByZXBsYWNlVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXJlcGxhY2UtdXJsJylcbiAgICBjb25zdCBlbGVtZW50SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHNhdmVUeXBlID0gbnVsbFxuICAgIGxldCBwYXRoID0gbnVsbFxuXG4gICAgaWYgKHB1c2hVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcHVzaFVybFxuICAgIH0gZWxzZSBpZiAocmVwbGFjZVVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncmVwbGFjZSdcbiAgICAgIHBhdGggPSByZXBsYWNlVXJsXG4gICAgfSBlbHNlIGlmIChlbGVtZW50SXNCb29zdGVkKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgIC8vIGZhbHNlIGluZGljYXRlcyBubyBwdXNoLCByZXR1cm4gZW1wdHkgb2JqZWN0XG4gICAgICBpZiAocGF0aCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgLy8gdHJ1ZSBpbmRpY2F0ZXMgd2Ugd2FudCB0byBmb2xsb3cgd2hlcmV2ZXIgdGhlIHNlcnZlciBlbmRlZCB1cCBzZW5kaW5nIHVzXG4gICAgICBpZiAocGF0aCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgICB9XG5cbiAgICAgIC8vIHJlc3RvcmUgYW55IGFuY2hvciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RcbiAgICAgIGlmIChyZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yICYmIHBhdGguaW5kZXhPZignIycpID09PSAtMSkge1xuICAgICAgICBwYXRoID0gcGF0aCArICcjJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogc2F2ZVR5cGUsXG4gICAgICAgIHBhdGhcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9IHJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0NvbmZpZywgc3RhdHVzKSB7XG4gICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVzcG9uc2VIYW5kbGluZ0NvbmZpZy5jb2RlKVxuICAgIHJldHVybiByZWdFeHAudGVzdChzdGF0dXMudG9TdHJpbmcoMTApKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ31cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnICovXG4gICAgICB2YXIgcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQgPSBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nW2ldXG4gICAgICBpZiAoY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQsIHhoci5zdGF0dXMpKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUhhbmRsaW5nRWxlbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBubyBtYXRjaGVzLCByZXR1cm4gbm8gc3dhcFxuICAgIHJldHVybiB7XG4gICAgICBzd2FwOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRpdGxlKHRpdGxlKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBjb25zdCB0aXRsZUVsdCA9IGZpbmQoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsdCkge1xuICAgICAgICB0aXRsZUVsdC5pbm5lckhUTUwgPSB0aXRsZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnRpdGxlID0gdGl0bGVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUFqYXhSZXNwb25zZShlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcbiAgICBsZXQgdGFyZ2V0ID0gcmVzcG9uc2VJbmZvLnRhcmdldFxuICAgIGNvbnN0IGV0YyA9IHJlc3BvbnNlSW5mby5ldGNcbiAgICBjb25zdCByZXNwb25zZUluZm9TZWxlY3QgPSByZXNwb25zZUluZm8uc2VsZWN0XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZU9uTG9hZCcsIHJlc3BvbnNlSW5mbykpIHJldHVyblxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyOi9pKSkge1xuICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyJywgZWx0KVxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtTG9jYXRpb246L2kpKSB7XG4gICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgbGV0IHJlZGlyZWN0UGF0aCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtTG9jYXRpb24nKVxuICAgICAgLyoqIEB0eXBlIHtIdG14QWpheEhlbHBlckNvbnRleHQme3BhdGg6c3RyaW5nfX0gKi9cbiAgICAgIHZhciByZWRpcmVjdFN3YXBTcGVjXG4gICAgICBpZiAocmVkaXJlY3RQYXRoLmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgICByZWRpcmVjdFN3YXBTcGVjID0gcGFyc2VKU09OKHJlZGlyZWN0UGF0aClcbiAgICAgICAgLy8gd2hhdCdzIHRoZSBiZXN0IHdheSB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdXNlciBkaWRuJ3QgaW5jbHVkZSB0aGlzXG4gICAgICAgIHJlZGlyZWN0UGF0aCA9IHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgICBkZWxldGUgcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICB9XG4gICAgICBhamF4SGVscGVyKCdnZXQnLCByZWRpcmVjdFBhdGgsIHJlZGlyZWN0U3dhcFNwZWMpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShyZWRpcmVjdFBhdGgpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUmVmcmVzaCA9IGhhc0hlYWRlcih4aHIsIC9IWC1SZWZyZXNoOi9pKSAmJiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZnJlc2gnKSA9PT0gJ3RydWUnXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlZGlyZWN0Oi9pKSkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24uaHJlZiA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVkaXJlY3QnKVxuICAgICAgc2hvdWxkUmVmcmVzaCAmJiBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlZnJlc2gpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGlzdG9yeVVwZGF0ZSA9IGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKVxuXG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGluZyA9IHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocilcbiAgICBjb25zdCBzaG91bGRTd2FwID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwXG4gICAgbGV0IGlzRXJyb3IgPSAhIXJlc3BvbnNlSGFuZGxpbmcuZXJyb3JcbiAgICBsZXQgaWdub3JlVGl0bGUgPSBodG14LmNvbmZpZy5pZ25vcmVUaXRsZSB8fCByZXNwb25zZUhhbmRsaW5nLmlnbm9yZVRpdGxlXG4gICAgbGV0IHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zZWxlY3RcbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy50YXJnZXQpIHtcbiAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSlcbiAgICB9XG4gICAgdmFyIHN3YXBPdmVycmlkZSA9IGV0Yy5zd2FwT3ZlcnJpZGVcbiAgICBpZiAoc3dhcE92ZXJyaWRlID09IG51bGwgJiYgcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGUpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlXG4gICAgfVxuXG4gICAgLy8gcmVzcG9uc2UgaGVhZGVycyBvdmVycmlkZSByZXNwb25zZSBoYW5kbGluZyBjb25maWdcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgIH1cblxuICAgIHZhciBzZXJ2ZXJSZXNwb25zZSA9IHhoci5yZXNwb25zZVxuICAgIC8qKiBAdHlwZSBIdG14QmVmb3JlU3dhcERldGFpbHMgKi9cbiAgICB2YXIgYmVmb3JlU3dhcERldGFpbHMgPSBtZXJnZU9iamVjdHMoe1xuICAgICAgc2hvdWxkU3dhcCxcbiAgICAgIHNlcnZlclJlc3BvbnNlLFxuICAgICAgaXNFcnJvcixcbiAgICAgIGlnbm9yZVRpdGxlLFxuICAgICAgc2VsZWN0T3ZlcnJpZGVcbiAgICB9LCByZXNwb25zZUluZm8pXG5cbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy5ldmVudCAmJiAhdHJpZ2dlckV2ZW50KHRhcmdldCwgcmVzcG9uc2VIYW5kbGluZy5ldmVudCwgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6YmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgc2VydmVyUmVzcG9uc2UgPSBiZWZvcmVTd2FwRGV0YWlscy5zZXJ2ZXJSZXNwb25zZSAvLyBhbGxvdyB1cGRhdGluZyBjb250ZW50XG4gICAgaXNFcnJvciA9IGJlZm9yZVN3YXBEZXRhaWxzLmlzRXJyb3IgLy8gYWxsb3cgdXBkYXRpbmcgZXJyb3JcbiAgICBpZ25vcmVUaXRsZSA9IGJlZm9yZVN3YXBEZXRhaWxzLmlnbm9yZVRpdGxlIC8vIGFsbG93IHVwZGF0aW5nIGlnbm9yaW5nIHRpdGxlXG4gICAgc2VsZWN0T3ZlcnJpZGUgPSBiZWZvcmVTd2FwRGV0YWlscy5zZWxlY3RPdmVycmlkZSAvLyBhbGxvdyB1cGRhdGluZyBzZWxlY3Qgb3ZlcnJpZGVcblxuICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSB0YXJnZXQgLy8gTWFrZSB1cGRhdGVkIHRhcmdldCBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLmZhaWxlZCA9IGlzRXJyb3IgLy8gTWFrZSBmYWlsZWQgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5zdWNjZXNzZnVsID0gIWlzRXJyb3IgLy8gTWFrZSBzdWNjZXNzZnVsIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcblxuICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjg2KSB7XG4gICAgICAgIGNhbmNlbFBvbGxpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IGV4dGVuc2lvbi50cmFuc2Zvcm1SZXNwb25zZShzZXJ2ZXJSZXNwb25zZSwgeGhyLCBlbHQpXG4gICAgICB9KVxuXG4gICAgICAvLyBTYXZlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSB3aWxsIGJlIGEgaGlzdG9yeSB1cGRhdGVcbiAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICAgIH1cbiAgICAgIHZhciBzd2FwU3BlYyA9IGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcE92ZXJyaWRlKVxuXG4gICAgICBpZiAoIXN3YXBTcGVjLmhhc093blByb3BlcnR5KCdpZ25vcmVUaXRsZScpKSB7XG4gICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gaWdub3JlVGl0bGVcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcblxuICAgICAgLy8gb3B0aW9uYWwgdHJhbnNpdGlvbiBBUEkgcHJvbWlzZSBjYWxsYmFja3NcbiAgICAgIGxldCBzZXR0bGVSZXNvbHZlID0gbnVsbFxuICAgICAgbGV0IHNldHRsZVJlamVjdCA9IG51bGxcblxuICAgICAgaWYgKHJlc3BvbnNlSW5mb1NlbGVjdCkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSW5mb1NlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc2VsZWN0Oi9pKSkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzZWxlY3QnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3RPT0IgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0LW9vYicpXG4gICAgICBjb25zdCBzZWxlY3QgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0JylcblxuICAgICAgbGV0IGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGlmIHdlIG5lZWQgdG8gc2F2ZSBoaXN0b3J5LCBkbyBzbywgYmVmb3JlIHN3YXBwaW5nIHNvIHRoYXQgcmVsYXRpdmUgcmVzb3VyY2VzIGhhdmUgdGhlIGNvcnJlY3QgYmFzZSBVUkxcbiAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5VXBkYXRlJywgbWVyZ2VPYmplY3RzKHsgaGlzdG9yeTogaGlzdG9yeVVwZGF0ZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnB1c2hlZEludG9IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VVcmxJbkhpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpyZXBsYWNlZEluSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dhcCh0YXJnZXQsIHNlcnZlclJlc3BvbnNlLCBzd2FwU3BlYywge1xuICAgICAgICAgICAgc2VsZWN0OiBzZWxlY3RPdmVycmlkZSB8fCBzZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3RPT0IsXG4gICAgICAgICAgICBldmVudEluZm86IHJlc3BvbnNlSW5mbyxcbiAgICAgICAgICAgIGFuY2hvcjogcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvcixcbiAgICAgICAgICAgIGNvbnRleHRFbGVtZW50OiBlbHQsXG4gICAgICAgICAgICBhZnRlclN3YXBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1Td2FwOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1Td2FwJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlclNldHRsZUNhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVNldHRsZTovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlc29sdmUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3dhcEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZWplY3QpXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBzaG91bGRUcmFuc2l0aW9uID0gaHRteC5jb25maWcuZ2xvYmFsVmlld1RyYW5zaXRpb25zXG4gICAgICBpZiAoc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ3RyYW5zaXRpb24nKSkge1xuICAgICAgICBzaG91bGRUcmFuc2l0aW9uID0gc3dhcFNwZWMudHJhbnNpdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVUcmFuc2l0aW9uJywgcmVzcG9uc2VJbmZvKSAmJlxuICAgICAgICAgICAgICB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBjb25zdCBzZXR0bGVQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgICBzZXR0bGVSZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgICBzZXR0bGVSZWplY3QgPSBfcmVqZWN0XG4gICAgICAgIH0pXG4gICAgICAgIC8vIHdyYXAgdGhlIG9yaWdpbmFsIGRvU3dhcCgpIGluIGEgY2FsbCB0byBzdGFydFZpZXdUcmFuc2l0aW9uKClcbiAgICAgICAgY29uc3QgaW5uZXJEb1N3YXAgPSBkb1N3YXBcbiAgICAgICAgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5uZXJEb1N3YXAoKVxuICAgICAgICAgICAgcmV0dXJuIHNldHRsZVByb21pc2VcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzd2FwU3BlYy5zd2FwRGVsYXkgPiAwKSB7XG4gICAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9Td2FwLCBzd2FwU3BlYy5zd2FwRGVsYXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1N3YXAoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNFcnJvcikge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpyZXNwb25zZUVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6ICdSZXNwb25zZSBTdGF0dXMgRXJyb3IgQ29kZSAnICsgeGhyLnN0YXR1cyArICcgZnJvbSAnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlcXVlc3RQYXRoIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXh0ZW5zaW9ucyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIEh0bXhFeHRlbnNpb24+fSAqL1xuICBjb25zdCBleHRlbnNpb25zID0ge31cblxuICAvKipcbiAgICogZXh0ZW5zaW9uQmFzZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYWxsIGV4dGVuc2lvbnMuXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZXh0ZW5zaW9uQmFzZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5pdDogZnVuY3Rpb24oYXBpKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgb25FdmVudDogZnVuY3Rpb24obmFtZSwgZXZ0KSB7IHJldHVybiB0cnVlIH0sXG4gICAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24odGV4dCwgeGhyLCBlbHQpIHsgcmV0dXJuIHRleHQgfSxcbiAgICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgaGFuZGxlU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24oeGhyLCBwYXJhbWV0ZXJzLCBlbHQpIHsgcmV0dXJuIG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZWZpbmVFeHRlbnNpb24gaW5pdGlhbGl6ZXMgdGhlIGV4dGVuc2lvbiBhbmQgYWRkcyBpdCB0byB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNkZWZpbmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbn0gZXh0ZW5zaW9uIHRoZSBleHRlbnNpb24gZGVmaW5pdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gZGVmaW5lRXh0ZW5zaW9uKG5hbWUsIGV4dGVuc2lvbikge1xuICAgIGlmIChleHRlbnNpb24uaW5pdCkge1xuICAgICAgZXh0ZW5zaW9uLmluaXQoaW50ZXJuYWxBUEkpXG4gICAgfVxuICAgIGV4dGVuc2lvbnNbbmFtZV0gPSBtZXJnZU9iamVjdHMoZXh0ZW5zaW9uQmFzZSgpLCBleHRlbnNpb24pXG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlRXh0ZW5zaW9uIHJlbW92ZXMgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFeHRlbnNpb24obmFtZSkge1xuICAgIGRlbGV0ZSBleHRlbnNpb25zW25hbWVdXG4gIH1cblxuICAvKipcbiAgICogZ2V0RXh0ZW5zaW9ucyBzZWFyY2hlcyB1cCB0aGUgRE9NIHRyZWUgdG8gcmV0dXJuIGFsbCBleHRlbnNpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbltdPX0gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nW109fSBleHRlbnNpb25zVG9JZ25vcmVcbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEV4dGVuc2lvbnMoZWx0LCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSkge1xuICAgIGlmIChleHRlbnNpb25zVG9SZXR1cm4gPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9SZXR1cm4gPSBbXVxuICAgIH1cbiAgICBpZiAoZWx0ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbnNUb1JldHVyblxuICAgIH1cbiAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlID0gW11cbiAgICB9XG4gICAgY29uc3QgZXh0ZW5zaW9uc0ZvckVsZW1lbnQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1leHQnKVxuICAgIGlmIChleHRlbnNpb25zRm9yRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChleHRlbnNpb25zRm9yRWxlbWVudC5zcGxpdCgnLCcpLCBmdW5jdGlvbihleHRlbnNpb25OYW1lKSB7XG4gICAgICAgIGV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb25OYW1lLnJlcGxhY2UoLyAvZywgJycpXG4gICAgICAgIGlmIChleHRlbnNpb25OYW1lLnNsaWNlKDAsIDcpID09ICdpZ25vcmU6Jykge1xuICAgICAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZS5wdXNoKGV4dGVuc2lvbk5hbWUuc2xpY2UoNykpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZS5pbmRleE9mKGV4dGVuc2lvbk5hbWUpIDwgMCkge1xuICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uTmFtZV1cbiAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmIGV4dGVuc2lvbnNUb1JldHVybi5pbmRleE9mKGV4dGVuc2lvbikgPCAwKSB7XG4gICAgICAgICAgICBleHRlbnNpb25zVG9SZXR1cm4ucHVzaChleHRlbnNpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEluaXRpYWxpemF0aW9uXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpc1JlYWR5ID0gZmFsc2VcbiAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgaXNSZWFkeSA9IHRydWVcbiAgfSlcblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIG5vdyBpZiBET01Db250ZW50TG9hZGVkIGhhcyBmaXJlZCwgb3RoZXJ3aXNlIGxpc3RlbiBmb3IgaXQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdXNlcyBpc1JlYWR5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGFzayB0aGUgYnJvd3NlciB3aGV0aGVyXG4gICAqIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gZmlyZWQ7IHRoZXJlJ3MgYSBnYXAgYmV0d2VlbiBET01Db250ZW50TG9hZGVkXG4gICAqIGZpcmluZyBhbmQgcmVhZHlzdGF0ZT1jb21wbGV0ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWR5KGZuKSB7XG4gICAgLy8gQ2hlY2tpbmcgcmVhZHlTdGF0ZSBoZXJlIGlzIGEgZmFpbHNhZmUgaW4gY2FzZSB0aGUgaHRteCBzY3JpcHQgdGFnIGVudGVyZWQgdGhlIERPTSBieVxuICAgIC8vIHNvbWUgbWVhbnMgb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQuXG4gICAgaWYgKGlzUmVhZHkgfHwgZ2V0RG9jdW1lbnQoKS5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICBmbigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydEluZGljYXRvclN0eWxlcygpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaW5jbHVkZUluZGljYXRvclN0eWxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG5vbmNlQXR0cmlidXRlID0gaHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZSA/IGAgbm9uY2U9XCIke2h0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2V9XCJgIDogJydcbiAgICAgIGdldERvY3VtZW50KCkuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsXG4gICAgICAgICc8c3R5bGUnICsgbm9uY2VBdHRyaWJ1dGUgKyAnPlxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjB9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJyAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJy4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgPC9zdHlsZT4nKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1ldGFDb25maWcoKSB7XG4gICAgLyoqIEB0eXBlIEhUTUxNZXRhRWxlbWVudCAqL1xuICAgIGNvbnN0IGVsZW1lbnQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImh0bXgtY29uZmlnXCJdJylcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHBhcnNlSlNPTihlbGVtZW50LmNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VNZXRhQ29uZmlnKCkge1xuICAgIGNvbnN0IG1ldGFDb25maWcgPSBnZXRNZXRhQ29uZmlnKClcbiAgICBpZiAobWV0YUNvbmZpZykge1xuICAgICAgaHRteC5jb25maWcgPSBtZXJnZU9iamVjdHMoaHRteC5jb25maWcsIG1ldGFDb25maWcpXG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnRcbiAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgbWVyZ2VNZXRhQ29uZmlnKClcbiAgICBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKVxuICAgIGxldCBib2R5ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgcHJvY2Vzc05vZGUoYm9keSlcbiAgICBjb25zdCByZXN0b3JlZEVsdHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIltoeC10cmlnZ2VyPSdyZXN0b3JlZCddLFtkYXRhLWh4LXRyaWdnZXI9J3Jlc3RvcmVkJ11cIlxuICAgIClcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWJvcnQnLCBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXRcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YSh0YXJnZXQpXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhICYmIGludGVybmFsRGF0YS54aHIpIHtcbiAgICAgICAgaW50ZXJuYWxEYXRhLnhoci5hYm9ydCgpXG4gICAgICB9XG4gICAgfSlcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIGNvbnN0IG9yaWdpbmFsUG9wc3RhdGUgPSB3aW5kb3cub25wb3BzdGF0ZSA/IHdpbmRvdy5vbnBvcHN0YXRlLmJpbmQod2luZG93KSA6IG51bGxcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5zdGF0ZSAmJiBldmVudC5zdGF0ZS5odG14KSB7XG4gICAgICAgIHJlc3RvcmVIaXN0b3J5KClcbiAgICAgICAgZm9yRWFjaChyZXN0b3JlZEVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnJlc3RvcmVkJywge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGdldERvY3VtZW50KCksXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsUG9wc3RhdGUpIHtcbiAgICAgICAgICBvcmlnaW5hbFBvcHN0YXRlKGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoYm9keSwgJ2h0bXg6bG9hZCcsIHt9KSAvLyBnaXZlIHJlYWR5IGhhbmRsZXJzIGEgY2hhbmNlIHRvIGxvYWQgdXAgYmVmb3JlIGZpcmluZyB0aGlzIGV2ZW50XG4gICAgICBib2R5ID0gbnVsbCAvLyBraWxsIHJlZmVyZW5jZSBmb3IgZ2NcbiAgICB9LCAwKVxuICB9KVxuXG4gIHJldHVybiBodG14XG59KSgpXG5cbi8qKiBAdHlwZWRlZiB7J2dldCd8J2hlYWQnfCdwb3N0J3wncHV0J3wnZGVsZXRlJ3wnY29ubmVjdCd8J29wdGlvbnMnfCd0cmFjZSd8J3BhdGNoJ30gSHR0cFZlcmIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2FwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdE9PQl1cbiAqIEBwcm9wZXJ0eSB7Kn0gW2V2ZW50SW5mb11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYW5jaG9yXVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbY29udGV4dEVsZW1lbnRdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU3dhcENhbGxiYWNrXVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclNldHRsZUNhbGxiYWNrXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHN3YXBDYWxsYmFja1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeydpbm5lckhUTUwnIHwgJ291dGVySFRNTCcgfCAnYmVmb3JlYmVnaW4nIHwgJ2FmdGVyYmVnaW4nIHwgJ2JlZm9yZWVuZCcgfCAnYWZ0ZXJlbmQnIHwgJ2RlbGV0ZScgfCAnbm9uZScgfCBzdHJpbmd9IEh0bXhTd2FwU3R5bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEh0bXhTd2FwU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzd2FwRGVsYXlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZXR0bGVEZWxheVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJhbnNpdGlvbl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoZWFkXVxuICogQHByb3BlcnR5IHsndG9wJyB8ICdib3R0b20nfSBbc2Nyb2xsXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JvbGxUYXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3ddXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3dUYXJnZXRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb2N1c1Njcm9sbF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKHRoaXM6Tm9kZSwgZXZ0OkV2ZW50KSA9PiBib29sZWFuKSAmIHtzb3VyY2U6IHN0cmluZ319IENvbmRpdGlvbmFsRnVuY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9sbEludGVydmFsXVxuICogQHByb3BlcnR5IHtDb25kaXRpb25hbEZ1bmN0aW9ufSBbZXZlbnRGaWx0ZXJdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjaGFuZ2VkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbb25jZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnN1bWVdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmcm9tXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Rocm90dGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9vdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyZXNob2xkXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tlbHQ6IEVsZW1lbnQsIG1lc3NhZ2U6IHN0cmluZywgdmFsaWRpdHk6IFZhbGlkaXR5U3RhdGV9fSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gSFgtUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlclxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlci1OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UYXJnZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIWC1DdXJyZW50LVVSTFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtIWC1Qcm9tcHRdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUJvb3N0ZWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0NvbnRlbnQtVHlwZV1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3RdXG4gKi9cblxuLyoqIEB0eXBlZGVmIEh0bXhBamF4SGVscGVyQ29udGV4dFxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3NvdXJjZV1cbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IFtldmVudF1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlVXJsUGFyYW1zXG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHBhcmFtZXRlcnMgZm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IHVuZmlsdGVyZWRGb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHVuZmlsdGVyZWRQYXJhbWV0ZXJzIHVuZmlsdGVyZWRGb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn0gaGVhZGVyc1xuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEBwcm9wZXJ0eSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpdGhDcmVkZW50aWFsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoXG4gKiBAcHJvcGVydHkge0V2ZW50fSB0cmlnZ2VyaW5nRXZlbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUluZm9cbiAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhFdGN9IGV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VsZWN0XG4gKiBAcHJvcGVydHkge3tyZXF1ZXN0UGF0aDogc3RyaW5nLCBmaW5hbFJlcXVlc3RQYXRoOiBzdHJpbmcsIHJlc3BvbnNlUGF0aDogc3RyaW5nfG51bGwsIGFuY2hvcjogc3RyaW5nfX0gcGF0aEluZm9cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N1Y2Nlc3NmdWxdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtrZWVwSW5kaWNhdG9yc11cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhBamF4RXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXR1cm5Qcm9taXNlXVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFt0YXJnZXRPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2RlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBzd2FwXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlcnJvcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtldmVudF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIdG14UmVzcG9uc2VJbmZvICYge3Nob3VsZFN3YXA6IGJvb2xlYW4sIHNlcnZlclJlc3BvbnNlOiBhbnksIGlzRXJyb3I6IGJvb2xlYW4sIGlnbm9yZVRpdGxlOiBib29sZWFuLCBzZWxlY3RPdmVycmlkZTpzdHJpbmd9fSBIdG14QmVmb3JlU3dhcERldGFpbHNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBIdG14QWpheEhhbmRsZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygoKSA9PiB2b2lkKX0gSHRteFNldHRsZVRhc2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhTZXR0bGVJbmZvXG4gKiBAcHJvcGVydHkge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gZWx0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aXRsZV1cbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgtZXh0ZW5zaW9ucy9ibG9iL21haW4vUkVBRE1FLm1kXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14RXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkgeyhhcGk6IGFueSkgPT4gdm9pZH0gaW5pdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnR8Q3VzdG9tRXZlbnQpID0+IGJvb2xlYW59IG9uRXZlbnRcbiAqIEBwcm9wZXJ0eSB7KHRleHQ6IHN0cmluZywgeGhyOiBYTUxIdHRwUmVxdWVzdCwgZWx0OiBFbGVtZW50KSA9PiBzdHJpbmd9IHRyYW5zZm9ybVJlc3BvbnNlXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpID0+IGJvb2xlYW59IGlzSW5saW5lU3dhcFxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLCB0YXJnZXQ6IE5vZGUsIGZyYWdtZW50OiBOb2RlLCBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbykgPT4gYm9vbGVhbnxOb2RlW119IGhhbmRsZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHhocjogWE1MSHR0cFJlcXVlc3QsIHBhcmFtZXRlcnM6IEZvcm1EYXRhLCBlbHQ6IE5vZGUpID0+ICp8c3RyaW5nfG51bGx9IGVuY29kZVBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nW118bnVsbH0gZ2V0U2VsZWN0b3JzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGh0bXhcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBkZXBlbmRzT24ocGF0aFNwZWM6IGFueSwgdXJsOiBzdHJpbmcpIHtcbiAgaWYgKHBhdGhTcGVjID09PSBcImlnbm9yZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGRlcGVuZGVuY3lQYXRoID0gcGF0aFNwZWMuc3BsaXQoXCIvXCIpO1xuICBjb25zdCB1cmxQYXRoID0gdXJsLnNwbGl0KFwiL1wiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeUVsZW1lbnQgPSBkZXBlbmRlbmN5UGF0aC5zaGlmdCgpO1xuICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gdXJsUGF0aFtpXTtcbiAgICBpZiAoZGVwZW5kZW5jeUVsZW1lbnQgIT09IHBhdGhFbGVtZW50ICYmIGRlcGVuZGVuY3lFbGVtZW50ICE9PSBcIipcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDAgfHxcbiAgICAgIChkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDEgJiYgZGVwZW5kZW5jeVBhdGhbMF0gPT09IFwiXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgZWx0c1dpdGhEZXBzID0gaHRteC5maW5kQWxsKFwiW3BhdGgtZGVwc11cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0c1dpdGhEZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZWx0ID0gZWx0c1dpdGhEZXBzW2ldO1xuICAgIGlmIChkZXBlbmRzT24oZWx0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSwgcGF0aCkpIHtcbiAgICAgIGh0bXgudHJpZ2dlcihlbHQsIFwicGF0aC1kZXBzXCIsIG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInBhdGgtZGVwc1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmJlZm9yZU9uTG9hZFwiKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBldnQuZGV0YWlsLnJlcXVlc3RDb25maWc7XG4gICAgICAvLyBtdXRhdGluZyBjYWxsXG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZyAmJlxuICAgICAgICBjb25maWcudmVyYiAhPT0gXCJnZXRcIiAmJlxuICAgICAgICBldnQudGFyZ2V0ICE9IG51bGwgJiZcbiAgICAgICAgZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgZXZ0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIikgIT09IFwiaWdub3JlXCJcbiAgICAgICkge1xuICAgICAgICByZWZyZXNoUGF0aChjb25maWcucGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCwge0h0bXhTZXR0bGVJbmZvLCBIdG14U3dhcFN0eWxlfSBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBldmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJztcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLnJlcGxhY2UoXCJoeC1vbjo6XCIsIFwiaHRteDpcIiksIGV2ZW50LmRldGFpbClcbiAgICAgICAgICAgICAgICAgICAgZS5kaXNwYXRjaEV2ZW50KG5ld0V2ZW50KVxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQuYWRkKGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4oZSBhcyBIVE1MRWxlbWVudCwgbmFtZSwgZXZlbnQsIHRyaWdnZXJlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJ0cmlnZ2VyLWNoaWxkcmVuXCIsIHtcbiAgICBvbkV2ZW50OiAobmFtZSwgZXZ0OiBFdmVudCB8IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKGV2dC5kZXRhaWwubWV0YSA9PT0gJ3RyaWdnZXItY2hpbGRyZW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJpZ2dlcmVkID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8fCBldnQuZGV0YWlsLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdHJpZ2dlckNoaWxkcmVuKHRhcmdldCwgbmFtZSwgZXZ0LCB0cmlnZ2VyZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGk6IGFueSk6IHZvaWQge1xuICAgIH0sXG4gICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uIChcbiAgICAgICAgdGV4dDogc3RyaW5nLFxuICAgICAgICB4aHI6IFhNTEh0dHBSZXF1ZXN0LFxuICAgICAgICBlbHQ6IEVsZW1lbnQsXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfSxcbiAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uIChzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgaGFuZGxlU3dhcDogZnVuY3Rpb24gKFxuICAgICAgICBzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsXG4gICAgICAgIHRhcmdldDogTm9kZSxcbiAgICAgICAgZnJhZ21lbnQ6IE5vZGUsXG4gICAgICAgIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvLFxuICAgICk6IGJvb2xlYW4gfCBOb2RlW10ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIHBhcmFtZXRlcnM6IEZvcm1EYXRhLFxuICAgICAgICBlbHQ6IE5vZGUsXG4gICAgKSB7XG4gICAgfSxcbiAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uICgpOiBzdHJpbmdbXSB8IG51bGwge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJkZWJ1Z1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIGlmIChjb25zb2xlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkRFQlVHOlwiLCBuYW1lLCBldnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub29wXG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmNvbnN0IGNvbmZpZzogYW55ID0gaHRteC5jb25maWc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHRteFwiKS5IdG14SW50ZXJuYWxBcGl9ICovXG5sZXQgYXBpOiBhbnk7XG5cbmNvbnN0IGF0dHJQcmVmaXggPSBcImh4LXRhcmdldC1cIjtcblxuLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgc3RyaW5nLnN0YXJ0c1dpdGhcbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXg7XG59XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0gcmVzcENvZGVOdW1iZXJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9XG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BDb2RlVGFyZ2V0KGVsdDogRWxlbWVudCwgcmVzcENvZGVOdW1iZXI6IG51bWJlcikge1xuICBpZiAoIWVsdCB8fCAhcmVzcENvZGVOdW1iZXIpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJlc3BDb2RlID0gcmVzcENvZGVOdW1iZXIudG9TdHJpbmcoKTtcblxuICAvLyAnKicgaXMgdGhlIG9yaWdpbmFsIHN5bnRheCwgYXMgdGhlIG9idmlvdXMgY2hhcmFjdGVyIGZvciBhIHdpbGRjYXJkLlxuICAvLyBUaGUgJ3gnIGFsdGVybmF0aXZlIHdhcyBhZGRlZCBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IHdpdGggSFRNTFxuICAvLyB0ZW1wbGF0aW5nIGVuZ2luZXMsIGR1ZSB0byBhbWJpZ3VpdHkgYXJvdW5kIHdoaWNoIGNoYXJhY3RlcnMgYXJlXG4gIC8vIHN1cHBvcnRlZCBpbiBIVE1MIGF0dHJpYnV0ZXMuXG4gIC8vXG4gIC8vIFN0YXJ0IHdpdGggdGhlIG1vc3Qgc3BlY2lmaWMgcG9zc2libGUgYXR0cmlidXRlIGFuZCBnZW5lcmFsaXplIGZyb21cbiAgLy8gdGhlcmUuXG4gIGNvbnN0IGF0dHJQb3NzaWJpbGl0aWVzID0gW1xuICAgIHJlc3BDb2RlLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCJ4XCIsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInhcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIioqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4eFwiLFxuXG4gICAgXCIqXCIsXG4gICAgXCJ4XCIsXG4gICAgXCIqKipcIixcbiAgICBcInh4eFwiLFxuICBdO1xuICBpZiAoc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI0XCIpIHx8IHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNVwiKSkge1xuICAgIGF0dHJQb3NzaWJpbGl0aWVzLnB1c2goXCJlcnJvclwiKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clBvc3NpYmlsaXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhdHRyID0gYXR0clByZWZpeCArIGF0dHJQb3NzaWJpbGl0aWVzW2ldO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGFwaS5nZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKTtcbiAgICBpZiAoYXR0clZhbHVlKSB7XG4gICAgICBpZiAoYXR0clZhbHVlID09PSBcInRoaXNcIikge1xuICAgICAgICByZXR1cm4gYXBpLmZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFwaS5xdWVyeVNlbGVjdG9yRXh0KGVsdCwgYXR0clZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEBwYXJhbSB7RXZlbnR9IGV2dCAqL1xuZnVuY3Rpb24gaGFuZGxlRXJyb3JGbGFnKGV2dDogQ3VzdG9tRXZlbnQpIHtcbiAgaWYgKGV2dC5kZXRhaWwuaXNFcnJvcikge1xuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvcikge1xuICAgICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvcikge1xuICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IHRydWU7XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJyZXNwb25zZS10YXJnZXRzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBpbml0OiAoYXBpUmVmKSA9PiB7XG4gICAgYXBpID0gYXBpUmVmO1xuXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbmFtZSA9PT0gXCJodG14OmJlZm9yZVN3YXBcIiAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyAhPT0gMjAwXG4gICAgKSB7XG4gICAgICBpZiAoZXZ0LmRldGFpbC50YXJnZXQpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZykge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciAmJlxuICAgICAgICAgIGV2dC5kZXRhaWwueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLm1hdGNoKC9IWC1SZXRhcmdldDovaSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFldnQuZGV0YWlsLnJlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRSZXNwQ29kZVRhcmdldChcbiAgICAgICAgZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnLmVsdCxcbiAgICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzLFxuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgIGV2dC5kZXRhaWwudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJtdXRhdGlvbi1lcnJvclwiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmFmdGVyUmVxdWVzdFwiKSB7XG4gICAgICBpZiAoIWV2dC5kZXRhaWwgfHwgIWV2dC5kZXRhaWwueGhyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXR1cyA9IGV2dC5kZXRhaWwueGhyLnN0YXR1cztcbiAgICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIGh0bXguZmluZEFsbChcIltoeC1vblxcXFw6XFxcXDptdXRhdGlvbi1lcnJvcl1cIikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBcImh0bXg6bXV0YXRpb24tZXJyb3JcIiwgeyBzdGF0dXMgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQge2NyZWF0ZVdlYlNvY2tldENsaWVudH0gZnJvbSBcIi4uL3V0aWwvd3NcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59IiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmNvbnN0IGV2YWxGdW5jUmVnZXggPS9fX2V2YWxfW0EtWmEtejAtOV0rXFwoW2Etel0rXFwpL2dtXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiaHRtZ29cIiwge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgaWYobmFtZSA9PT0gXCJodG14OmJlZm9yZUNsZWFudXBFbGVtZW50XCIgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICB9XG4gICAgfSxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcylcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgIGNvbnN0IG1hdGNoZXMgPSBhdHRyaWJ1dGUudmFsdWUubWF0Y2goZXZhbEZ1bmNSZWdleCkgfHwgW11cbiAgICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBtYXRjaC5yZXBsYWNlKFwiKClcIiwgXCJcIikucmVwbGFjZShcIih0aGlzKVwiLCBcIlwiKS5yZXBsYWNlKFwiO1wiLCBcIlwiKVxuICAgICAgICAgICAgY29uc3QgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgICAgICBpZihlbGUgJiYgZWxlLnRhZ05hbWUgPT09IFwiU0NSSVBUXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwicmVtb3ZpbmcgYXNzb2NpYXRlZCBzY3JpcHQgd2l0aCBpZFwiLCBpZClcbiAgICAgICAgICAgICAgICBlbGUucmVtb3ZlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gJ2h0bXgub3JnJ1xuaW1wb3J0IHtyZW1vdmVBc3NvY2lhdGVkU2NyaXB0c30gZnJvbSBcIi4vaHRtZ29cIjtcblxuXG5cbmludGVyZmFjZSBIdG14SW50ZXJuYWxBcGkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQ6IEVsZW1lbnQpOiBhbnk7XG4gICAgYm9keUNvbnRhaW5zKGVsdDogRWxlbWVudCk6IGJvb2xlYW47XG4gICAgZ2V0QXR0cmlidXRlVmFsdWUoZWx0OiBFbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsO1xuICAgIHRyaWdnZXJFdmVudChlbHQ6IEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZGV0YWlsPzogYW55KTogYm9vbGVhbjtcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQ6IEVsZW1lbnQsIGNhbGxiYWNrOiAoZXh0ZW5zaW9uOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIG1ha2VTZXR0bGVJbmZvKGVsdDogRWxlbWVudCk6IGFueTtcbiAgICBtYWtlRnJhZ21lbnQoaHRtbDogc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudDtcbiAgICBvb2JTd2FwKHN3YXBTdHlsZTogc3RyaW5nLCBmcmFnbWVudDogRWxlbWVudCwgc2V0dGxlSW5mbzogYW55KTogdm9pZDtcbiAgICBzZXR0bGVJbW1lZGlhdGVseSh0YXNrczogYW55KTogdm9pZDtcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0OiBFbGVtZW50LCBjb25kaXRpb246IChub2RlOiBFbGVtZW50KSA9PiBib29sZWFuKTogRWxlbWVudCB8IG51bGw7XG4gICAgZ2V0VHJpZ2dlclNwZWNzKGVsdDogRWxlbWVudCk6IGFueVtdO1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdDogRWxlbWVudCwgdHJpZ2dlclNwZWM6IGFueSwgbm9kZURhdGE6IGFueSwgaGFuZGxlcjogKGVsdDogRWxlbWVudCwgZXZ0OiBFdmVudCkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgZ2V0SGVhZGVycyhlbHQ6IEVsZW1lbnQsIHRhcmdldDogRWxlbWVudCk6IGFueTtcbiAgICBnZXRUYXJnZXQoZWx0OiBFbGVtZW50KTogRWxlbWVudDtcbiAgICBnZXRJbnB1dFZhbHVlcyhlbHQ6IEVsZW1lbnQsIHZlcmI6IHN0cmluZyk6IHsgZXJyb3JzOiBhbnlbXTsgdmFsdWVzOiBhbnkgfTtcbiAgICBnZXRFeHByZXNzaW9uVmFycyhlbHQ6IEVsZW1lbnQpOiBhbnk7XG4gICAgbWVyZ2VPYmplY3RzKG9iajE6IGFueSwgb2JqMjogYW55KTogYW55O1xuICAgIGZpbHRlclZhbHVlcyh2YWx1ZXM6IGFueSwgZWx0OiBFbGVtZW50KTogYW55O1xuICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdD86IEVsZW1lbnQsIG5hbWU/OiBzdHJpbmcsIGRldGFpbD86IGFueSk6IHZvaWQ7XG4gICAgaGFzQXR0cmlidXRlKGVsdDogRWxlbWVudCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgICBzaG91bGRDYW5jZWwoZXZ0OiBFdmVudCwgZWx0OiBFbGVtZW50KTogYm9vbGVhbjtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmludGVyZmFjZSBXZWJTb2NrZXRXcmFwcGVyIHtcbiAgICBzb2NrZXQ6IFdlYlNvY2tldDtcbiAgICBldmVudHMgOiB7IFtrZXk6IHN0cmluZ106ICgoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkKVtdIH07XG4gICAgbWVzc2FnZVF1ZXVlOiB7IG1lc3NhZ2U6IHN0cmluZzsgc2VuZEVsdDogRWxlbWVudCB8IG51bGwgfVtdO1xuICAgIHJldHJ5Q291bnQ6IG51bWJlcjtcbiAgICBzZW5kSW1tZWRpYXRlbHkobWVzc2FnZTogc3RyaW5nLCBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCk6IHZvaWQ7XG4gICAgc2VuZChtZXNzYWdlOiBzdHJpbmcsIHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsKTogdm9pZDtcbiAgICBhZGRFdmVudExpc3RlbmVyKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IChldmVudDogRXZlbnQpID0+IHZvaWQpOiB2b2lkO1xuICAgIGhhbmRsZVF1ZXVlZE1lc3NhZ2VzKCk6IHZvaWQ7XG4gICAgaW5pdCgpOiB2b2lkO1xuICAgIGNsb3NlKCk6IHZvaWQ7XG4gICAgcHVibGljSW50ZXJmYWNlOiB7XG4gICAgICAgIHNlbmQ6IChtZXNzYWdlOiBzdHJpbmcsIHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsKSA9PiB2b2lkO1xuICAgICAgICBzZW5kSW1tZWRpYXRlbHk6IChtZXNzYWdlOiBzdHJpbmcsIHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsKSA9PiB2b2lkO1xuICAgICAgICBxdWV1ZTogeyBtZXNzYWdlOiBzdHJpbmc7IHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsIH1bXTtcbiAgICB9O1xufVxuXG5sZXQgYXBpOiBIdG14SW50ZXJuYWxBcGk7XG5cbmZ1bmN0aW9uIHNwbGl0T25XaGl0ZXNwYWNlKHRyaWdnZXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdHJpZ2dlci50cmltKCkuc3BsaXQoL1xccysvKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGVnYWN5V2Vic29ja2V0VVJMKGVsdDogRWxlbWVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbGVnYWN5U1NFVmFsdWUgPSBhcGkuZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtd3MnKTtcbiAgICBpZiAobGVnYWN5U1NFVmFsdWUpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gc3BsaXRPbldoaXRlc3BhY2UobGVnYWN5U1NFVmFsdWUpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaV0uc3BsaXQoLzooLispLyk7XG4gICAgICAgICAgICBpZiAodmFsdWVbMF0gPT09ICdjb25uZWN0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVXZWJTb2NrZXQoc29ja2V0RWx0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIElmIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIG5vIGxvbmdlciBleGlzdHMsIHRoZW5cbiAgICAvLyBkbyBub3QgY29ubmVjdC9yZWNvbm5lY3QgdGhlIFdlYlNvY2tldC5cbiAgICBpZiAoIWFwaS5ib2R5Q29udGFpbnMoc29ja2V0RWx0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBzb3VyY2Ugc3RyYWlnaHQgZnJvbSB0aGUgZWxlbWVudCdzIHZhbHVlXG4gICAgbGV0IHdzc1NvdXJjZSA9IGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShzb2NrZXRFbHQsICd3cy1jb25uZWN0Jyk7XG5cbiAgICBpZiAod3NzU291cmNlID09IG51bGwgfHwgd3NzU291cmNlID09PSAnJykge1xuICAgICAgICBjb25zdCBsZWdhY3lTb3VyY2UgPSBnZXRMZWdhY3lXZWJzb2NrZXRVUkwoc29ja2V0RWx0KTtcbiAgICAgICAgaWYgKGxlZ2FjeVNvdXJjZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3c3NTb3VyY2UgPSBsZWdhY3lTb3VyY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHdWFyYW50ZWUgdGhhdCB0aGUgd3NzU291cmNlIHZhbHVlIGlzIGEgZnVsbHkgcXVhbGlmaWVkIFVSTFxuICAgIGlmICh3c3NTb3VyY2UuaW5kZXhPZignLycpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IGJhc2VfcGFydCA9IGxvY2F0aW9uLmhvc3RuYW1lICsgKGxvY2F0aW9uLnBvcnQgPyAnOicgKyBsb2NhdGlvbi5wb3J0IDogJycpO1xuICAgICAgICBpZiAobG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgICAgICAgICB3c3NTb3VyY2UgPSAnd3NzOi8vJyArIGJhc2VfcGFydCArIHdzc1NvdXJjZTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHA6Jykge1xuICAgICAgICAgICAgd3NzU291cmNlID0gJ3dzOi8vJyArIGJhc2VfcGFydCArIHdzc1NvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNvY2tldFdyYXBwZXIgPSBjcmVhdGVXZWJzb2NrZXRXcmFwcGVyKHNvY2tldEVsdCwgKCkgPT4gY3JlYXRlV2ViU29ja2V0KHdzc1NvdXJjZSkpO1xuXG4gICAgc29ja2V0V3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChtYXliZUNsb3NlV2ViU29ja2V0U291cmNlKHNvY2tldEVsdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZSA9IChldmVudCBhcyBNZXNzYWdlRXZlbnQpLmRhdGE7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFhcGkudHJpZ2dlckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NCZWZvcmVNZXNzYWdlJywge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIHNvY2tldFdyYXBwZXI6IHNvY2tldFdyYXBwZXIucHVibGljSW50ZXJmYWNlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhcGkud2l0aEV4dGVuc2lvbnMoc29ja2V0RWx0LCAoZXh0ZW5zaW9uKSA9PiB7XG4gICAgICAgICAgICByZXNwb25zZSA9IGV4dGVuc2lvbi50cmFuc2Zvcm1SZXNwb25zZShyZXNwb25zZSwgbnVsbCwgc29ja2V0RWx0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IGFwaS5tYWtlU2V0dGxlSW5mbyhzb2NrZXRFbHQpO1xuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpO1xuXG4gICAgICAgIGlmIChmcmFnbWVudC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXVxuICAgICAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZHJlbltpXSwgc2V0dGxlSW5mbyk7XG4gICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBodG1nbyBldmFsX18gc2NyaXB0c1xuICAgICAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXBpLnNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpO1xuICAgICAgICBhcGkudHJpZ2dlckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NBZnRlck1lc3NhZ2UnLCB7XG4gICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZSxcbiAgICAgICAgICAgIHNvY2tldFdyYXBwZXI6IHNvY2tldFdyYXBwZXIucHVibGljSW50ZXJmYWNlLFxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFB1dCB0aGUgV2ViU29ja2V0IGludG8gdGhlIEhUTUwgRWxlbWVudCdzIGN1c3RvbSBkYXRhLlxuICAgIGFwaS5nZXRJbnRlcm5hbERhdGEoc29ja2V0RWx0KS53ZWJTb2NrZXQgPSBzb2NrZXRXcmFwcGVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVXZWJzb2NrZXRXcmFwcGVyKHNvY2tldEVsdDogSFRNTEVsZW1lbnQsIHNvY2tldEZ1bmM6ICgpID0+IFdlYlNvY2tldCk6IFdlYlNvY2tldFdyYXBwZXIge1xuICAgIGNvbnN0IHdyYXBwZXI6IFdlYlNvY2tldFdyYXBwZXIgPSB7XG4gICAgICAgIHNvY2tldDogbnVsbCBhcyB1bmtub3duIGFzIFdlYlNvY2tldCxcbiAgICAgICAgbWVzc2FnZVF1ZXVlOiBbXSxcbiAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgZXZlbnRzOiB7fSBhcyB7IFtrZXk6IHN0cmluZ106ICgoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkKVtdIH0sXG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKGV2ZW50OiBFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5ldmVudHNbZXZlbnRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudHNbZXZlbnRdID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZXZlbnRzW2V2ZW50XS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9LFxuICAgICAgICBzZW5kSW1tZWRpYXRlbHkobWVzc2FnZTogc3RyaW5nLCBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXJyb3JFdmVudChzb2NrZXRFbHQsICdodG14OndzRXJyb3InLCB7IGVycm9yOiAnTm8gc29ja2V0IGF2YWlsYWJsZScgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXNlbmRFbHQgfHxcbiAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckV2ZW50KHNlbmRFbHQsICdodG14OndzQmVmb3JlU2VuZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0V3JhcHBlcjogdGhpcy5wdWJsaWNJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbmRFbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFdmVudChzZW5kRWx0LCAnaHRteDp3c0FmdGVyU2VuZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRXcmFwcGVyOiB0aGlzLnB1YmxpY0ludGVyZmFjZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzZW5kKG1lc3NhZ2U6IHN0cmluZywgc2VuZEVsdDogRWxlbWVudCB8IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaCh7IG1lc3NhZ2UsIHNlbmRFbHQgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZEltbWVkaWF0ZWx5KG1lc3NhZ2UsIHNlbmRFbHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBoYW5kbGVRdWV1ZWRNZXNzYWdlcygpIHtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLm1lc3NhZ2VRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVldWVkSXRlbSA9IHRoaXMubWVzc2FnZVF1ZXVlWzBdO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZEltbWVkaWF0ZWx5KHF1ZXVlZEl0ZW0ubWVzc2FnZSwgcXVldWVkSXRlbS5zZW5kRWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuT1BFTikge1xuICAgICAgICAgICAgICAgIC8vIENsb3NlIGRpc2NhcmRlZCBzb2NrZXRcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgV2ViU29ja2V0IGFuZCBldmVudCBoYW5kbGVyc1xuICAgICAgICAgICAgY29uc3Qgc29ja2V0ID0gc29ja2V0RnVuYygpO1xuXG4gICAgICAgICAgICAvLyBUaGUgZXZlbnQudHlwZSBkZXRhaWwgaXMgYWRkZWQgZm9yIGludGVyZmFjZSBjb25mb3JtYW5jZSB3aXRoIHRoZVxuICAgICAgICAgICAgLy8gb3RoZXIgdHdvIGxpZmVjeWNsZSBldmVudHMgKG9wZW4gYW5kIGNsb3NlKSBzbyBhIHNpbmdsZSBoYW5kbGVyIG1ldGhvZFxuICAgICAgICAgICAgLy8gY2FuIGhhbmRsZSB0aGVtIHBvbHltb3JwaGljYWxseSwgaWYgcmVxdWlyZWQuXG4gICAgICAgICAgICBhcGkudHJpZ2dlckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NDb25uZWN0aW5nJywgeyBldmVudDogeyB0eXBlOiAnY29ubmVjdGluZycgfSB9KTtcblxuICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG5cbiAgICAgICAgICAgIHNvY2tldC5vbm9wZW4gPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFdmVudChzb2NrZXRFbHQsICdodG14OndzT3BlbicsIHsgZXZlbnQ6IGUsIHNvY2tldFdyYXBwZXI6IHRoaXMucHVibGljSW50ZXJmYWNlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUXVldWVkTWVzc2FnZXMoKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHNvY2tldC5vbmNsb3NlID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZiBzb2NrZXQgc2hvdWxkIG5vdCBiZSBjb25uZWN0ZWQsIHN0b3AgZnVydGhlciBhdHRlbXB0cyB0byBlc3RhYmxpc2ggY29ubmVjdGlvblxuICAgICAgICAgICAgICAgIC8vIElmIEFibm9ybWFsIENsb3N1cmUvU2VydmljZSBSZXN0YXJ0L1RyeSBBZ2FpbiBMYXRlciwgdGhlbiBzZXQgYSB0aW1lciB0byByZWNvbm5lY3QgYWZ0ZXIgYSBwYXVzZS5cbiAgICAgICAgICAgICAgICBpZiAoIW1heWJlQ2xvc2VXZWJTb2NrZXRTb3VyY2Uoc29ja2V0RWx0KSAmJiBbMTAwNiwgMTAxMiwgMTAxM10uaW5kZXhPZihlLmNvZGUpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsYXkgPSBnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheSh0aGlzLnJldHJ5Q291bnQpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGRlbGF5KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBOb3RpZnkgY2xpZW50IGNvZGUgdGhhdCBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZC4gQ2xpZW50IGNvZGUgY2FuIGluc3BlY3QgYGV2ZW50YCBmaWVsZFxuICAgICAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB3aGV0aGVyIGNsb3N1cmUgaGFzIGJlZW4gdmFsaWQgb3IgYWJub3JtYWxcbiAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckV2ZW50KHNvY2tldEVsdCwgJ2h0bXg6d3NDbG9zZScsIHsgZXZlbnQ6IGUsIHNvY2tldFdyYXBwZXI6IHRoaXMucHVibGljSW50ZXJmYWNlIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgc29ja2V0Lm9uZXJyb3IgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXJyb3JFdmVudChzb2NrZXRFbHQsICdodG14OndzRXJyb3InLCB7IGVycm9yOiBlLCBzb2NrZXRXcmFwcGVyOiB0aGlzIH0pO1xuICAgICAgICAgICAgICAgIG1heWJlQ2xvc2VXZWJTb2NrZXRTb3VyY2Uoc29ja2V0RWx0KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuZXZlbnRzO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZXZlbnRzKS5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnRzW2tdLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoaywgZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2UoKSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICB9LFxuICAgICAgICBwdWJsaWNJbnRlcmZhY2U6IHt9IGFzIGFueSxcbiAgICB9O1xuXG4gICAgd3JhcHBlci5pbml0KCk7XG5cbiAgICB3cmFwcGVyLnB1YmxpY0ludGVyZmFjZSA9IHtcbiAgICAgICAgc2VuZDogd3JhcHBlci5zZW5kLmJpbmQod3JhcHBlciksXG4gICAgICAgIHNlbmRJbW1lZGlhdGVseTogd3JhcHBlci5zZW5kSW1tZWRpYXRlbHkuYmluZCh3cmFwcGVyKSxcbiAgICAgICAgcXVldWU6IHdyYXBwZXIubWVzc2FnZVF1ZXVlLFxuICAgIH07XG5cbiAgICByZXR1cm4gd3JhcHBlcjtcbn1cblxuZnVuY3Rpb24gZW5zdXJlV2ViU29ja2V0U2VuZChlbHQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgbGVnYWN5QXR0cmlidXRlID0gYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXdzJyk7XG4gICAgaWYgKGxlZ2FjeUF0dHJpYnV0ZSAmJiBsZWdhY3lBdHRyaWJ1dGUgIT09ICdzZW5kJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViU29ja2V0UGFyZW50ID0gYXBpLmdldENsb3Nlc3RNYXRjaChlbHQsIChub2RlKSA9PiB7XG4gICAgICAgIHJldHVybiBoYXNXZWJTb2NrZXQobm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgfSk7XG4gICAgaWYgKHdlYlNvY2tldFBhcmVudCkge1xuICAgICAgICBwcm9jZXNzV2ViU29ja2V0U2VuZCh3ZWJTb2NrZXRQYXJlbnQgYXMgSFRNTEVsZW1lbnQsIGVsdCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYXNXZWJTb2NrZXQobm9kZTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXBpLmdldEludGVybmFsRGF0YShub2RlKS53ZWJTb2NrZXQgIT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1dlYlNvY2tldFNlbmQoc29ja2V0RWx0OiBIVE1MRWxlbWVudCwgc2VuZEVsdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGFwaS5nZXRJbnRlcm5hbERhdGEoc2VuZEVsdCk7XG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gYXBpLmdldFRyaWdnZXJTcGVjcyhzZW5kRWx0KTtcbiAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaCgodHMpID0+IHtcbiAgICAgICAgYXBpLmFkZFRyaWdnZXJIYW5kbGVyKHNlbmRFbHQsIHRzLCBub2RlRGF0YSwgKGVsdDogRWxlbWVudCwgZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKG1heWJlQ2xvc2VXZWJTb2NrZXRTb3VyY2Uoc29ja2V0RWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc29ja2V0V3JhcHBlcjogV2ViU29ja2V0V3JhcHBlciA9IGFwaS5nZXRJbnRlcm5hbERhdGEoc29ja2V0RWx0KS53ZWJTb2NrZXQ7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gYXBpLmdldEhlYWRlcnMoc2VuZEVsdCwgYXBpLmdldFRhcmdldChzZW5kRWx0KSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXBpLmdldElucHV0VmFsdWVzKHNlbmRFbHQsICdwb3N0Jyk7XG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSByZXN1bHRzLmVycm9ycztcbiAgICAgICAgICAgIGNvbnN0IHJhd1BhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCByZXN1bHRzLnZhbHVlcyk7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGFwaS5nZXRFeHByZXNzaW9uVmFycyhzZW5kRWx0KTtcbiAgICAgICAgICAgIGNvbnN0IGFsbFBhcmFtZXRlcnMgPSBhcGkubWVyZ2VPYmplY3RzKHJhd1BhcmFtZXRlcnMsIGV4cHJlc3Npb25WYXJzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1ldGVycyA9IGFwaS5maWx0ZXJWYWx1ZXMoYWxsUGFyYW1ldGVycywgc2VuZEVsdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbmRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogZmlsdGVyZWRQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBhbGxQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgZXJyb3JzLFxuXG4gICAgICAgICAgICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldnQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUJvZHk6IHVuZGVmaW5lZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc29ja2V0V3JhcHBlcjogc29ja2V0V3JhcHBlci5wdWJsaWNJbnRlcmZhY2UsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoIWFwaS50cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp3c0NvbmZpZ1NlbmQnLCBzZW5kQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIGVycm9ycyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYm9keSA9IHNlbmRDb25maWcubWVzc2FnZUJvZHk7XG4gICAgICAgICAgICBpZiAoYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9TZW5kID0gT2JqZWN0LmFzc2lnbih7fSwgc2VuZENvbmZpZy5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VuZENvbmZpZy5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvU2VuZC5IRUFERVJTID0gaGVhZGVycztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KHRvU2VuZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNvY2tldFdyYXBwZXIuc2VuZChib2R5LCBlbHQgYXMgRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmIChldnQgJiYgYXBpLnNob3VsZENhbmNlbChldnQsIGVsdCBhcyBFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkocmV0cnlDb3VudDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBleHAgPSBNYXRoLm1pbihyZXRyeUNvdW50LCA2KTtcbiAgICBjb25zdCBtYXhEZWxheSA9IDEwMDAgKiBNYXRoLnBvdygyLCBleHApO1xuICAgIHJldHVybiBtYXhEZWxheSAqIE1hdGgucmFuZG9tKCk7XG59XG5cbmZ1bmN0aW9uIG1heWJlQ2xvc2VXZWJTb2NrZXRTb3VyY2UoZWx0OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGlmICghYXBpLmJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgIGFwaS5nZXRJbnRlcm5hbERhdGEoZWx0KS53ZWJTb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlV2ViU29ja2V0KHVybDogc3RyaW5nKTogV2ViU29ja2V0IHtcbiAgICBjb25zdCBzb2NrID0gbmV3IFdlYlNvY2tldCh1cmwsIFtdKTtcbiAgICBzb2NrLmJpbmFyeVR5cGUgPSAoaHRteC5jb25maWcud3NCaW5hcnlUeXBlIHx8ICdibG9iJykgYXMgdW5rbm93biBhcyBCaW5hcnlUeXBlO1xuICAgIHJldHVybiBzb2NrO1xufVxuXG5mdW5jdGlvbiBxdWVyeUF0dHJpYnV0ZU9uVGhpc09yQ2hpbGRyZW4oZWx0OiBIVE1MRWxlbWVudCwgYXR0cmlidXRlTmFtZTogc3RyaW5nKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBIVE1MRWxlbWVudFtdID0gW107XG5cbiAgICAvLyBJZiB0aGUgcGFyZW50IGVsZW1lbnQgYWxzbyBjb250YWlucyB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZSwgdGhlbiBhZGQgaXQgdG8gdGhlIHJlc3VsdHMgdG9vLlxuICAgIGlmIChhcGkuaGFzQXR0cmlidXRlKGVsdCwgYXR0cmlidXRlTmFtZSkgfHwgYXBpLmhhc0F0dHJpYnV0ZShlbHQsICdoeC13cycpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGVsdCk7XG4gICAgfVxuXG4gICAgLy8gU2VhcmNoIGFsbCBjaGlsZCBub2RlcyB0aGF0IG1hdGNoIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlXG4gICAgZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ1snICsgYXR0cmlidXRlTmFtZSArICddLCBbZGF0YS0nICsgYXR0cmlidXRlTmFtZSArICddLCBbZGF0YS1oeC13c10sIFtoeC13c10nKS5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaDxUPihhcnI6IFRbXSwgZnVuYzogKGl0ZW06IFQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoYXJyKSB7XG4gICAgICAgIGFyci5mb3JFYWNoKGZ1bmMpO1xuICAgIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oJ3dzJywge1xuICAgIGluaXQ6IChhcGlSZWY6IEh0bXhJbnRlcm5hbEFwaSkgPT4ge1xuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2UgdG8gaW50ZXJuYWwgQVBJXG4gICAgICAgIGFwaSA9IGFwaVJlZjtcbiAgICB9LFxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IChuYW1lOiBzdHJpbmcsIGV2dDogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgcGFyZW50OiBFbGVtZW50ID0gZXZ0LnRhcmdldCBhcyBFbGVtZW50IHx8IChldnQgYXMgQ3VzdG9tRXZlbnQpLmRldGFpbC5lbHQ7XG5cbiAgICAgICAgaWYoIShwYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gY2xvc2UgdGhlIHNvY2tldCB3aGVuIGVsZW1lbnRzIGFyZSByZW1vdmVkXG4gICAgICAgICAgICBjYXNlICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JzpcbiAgICAgICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhwYXJlbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGFwaS5nZXRJbnRlcm5hbERhdGEocGFyZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxEYXRhLndlYlNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbERhdGEud2ViU29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSB3ZWJzb2NrZXRzIHdoZW4gZWxlbWVudHMgYXJlIHByb2Nlc3NlZFxuICAgICAgICAgICAgY2FzZSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZSc6XG4gICAgICAgICAgICAgICAgZm9yRWFjaChxdWVyeUF0dHJpYnV0ZU9uVGhpc09yQ2hpbGRyZW4ocGFyZW50LCAnd3MtY29ubmVjdCcpLCAoY2hpbGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZW5zdXJlV2ViU29ja2V0KGNoaWxkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmb3JFYWNoKHF1ZXJ5QXR0cmlidXRlT25UaGlzT3JDaGlsZHJlbihwYXJlbnQsICd3cy1zZW5kJyksIChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbnN1cmVXZWJTb2NrZXRTZW5kKGNoaWxkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9wYXRoZGVwc1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2RlYnVnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3Jlc3BvbnNlLXRhcmdldHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3JcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbGl2ZXJlbG9hZFwiXG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2h0bWdvXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3dzXCJcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy93cy50cyIsIi4uL2pzL2h0bWdvLnRzIl0sIm5hbWVzIjpbImh0bXgiLCJlbHQiLCJ0eXBlIiwidmVyYiIsInRhZyIsImdsb2JhbCIsInN0ciIsImludGVydmFsIiwibmFtZSIsInF1YWxpZmllZE5hbWUiLCJwYXJlbnQiLCJjb25kaXRpb24iLCJpbml0aWFsRWxlbWVudCIsImFuY2VzdG9yIiwiYXR0cmlidXRlTmFtZSIsImF0dHJpYnV0ZVZhbHVlIiwiZGlzaW5oZXJpdCIsImluaGVyaXQiLCJjbG9zZXN0QXR0ciIsImUiLCJzZWxlY3RvciIsIm1hdGNoZXNGdW5jdGlvbiIsIm1hdGNoIiwicmVzcCIsImZyYWdtZW50Iiwic2NyaXB0IiwibmV3U2NyaXB0IiwiYXR0ciIsInJlc3BvbnNlIiwicmVzcG9uc2VXaXRoTm9IZWFkIiwic3RhcnRUYWciLCJkb2MiLCJ0aXRsZUVsZW1lbnQiLCJmdW5jIiwibyIsImRhdGFQcm9wIiwiZGF0YSIsImFyciIsInJldHVybkFyciIsImkiLCJlbCIsInJlY3QiLCJlbGVtVG9wIiwiZWxlbUJvdHRvbSIsInJvb3ROb2RlIiwidHJpZ2dlciIsIm9iajEiLCJvYmoyIiwia2V5IiwialN0cmluZyIsImVycm9yIiwidGVzdCIsInBhdGgiLCJ1cmwiLCJjYWxsYmFjayIsImV2dCIsImV2ZW50IiwiZWx0T3JTZWxlY3RvciIsImRlbGF5IiwidmFsdWUiLCJjbGF6eiIsIm5vZGUiLCJjaGlsZCIsInByZWZpeCIsInN1ZmZpeCIsInRyaW1tZWRTZWxlY3RvciIsInN0YXJ0IiwicmVzdWx0cyIsImNvbnRleHQiLCJhcmcxIiwiYXJnMiIsImFyZzMiLCJldmVudEFyZ3MiLCJhdHRyTmFtZSIsImF0dHJUYXJnZXQiLCJyZXN1bHQiLCJhdHRyaWJ1dGUiLCJ0YXJnZXRTdHIiLCJhdHRyaWJ1dGVzVG9TZXR0bGUiLCJtZXJnZVRvIiwibWVyZ2VGcm9tIiwic3dhcFN0eWxlIiwidGFyZ2V0IiwiZXh0ZW5zaW9ucyIsImV4dGVuc2lvbiIsIm9vYlZhbHVlIiwib29iRWxlbWVudCIsInNldHRsZUluZm8iLCJ0YXJnZXRzIiwib29iRWxlbWVudENsb25lIiwiYmVmb3JlU3dhcERldGFpbHMiLCJwcmVzZXJ2ZWRFbHQiLCJpZCIsIm9sZEVsdCIsInBhcmVudE5vZGUiLCJuZXdOb2RlIiwibm9ybWFsaXplZElkIiwibm9ybWFsaXplZFRhZyIsInBhcmVudEVsdCIsIm9sZE5vZGUiLCJuZXdBdHRyaWJ1dGVzIiwiYXV0b2ZvY3VzIiwiYXV0b0ZvY3VzZWRFbHQiLCJpbnNlcnRCZWZvcmUiLCJzdHJpbmciLCJoYXNoIiwiY2hhciIsImludGVybmFsRGF0YSIsImhhbmRsZXJJbmZvIiwiZWxlbWVudCIsImluZm8iLCJuZXdFbHQiLCJlbHRCZWZvcmVOZXdDb250ZW50IiwiZmlyc3RDaGlsZCIsImV4dCIsIm5ld0VsZW1lbnRzIiwiaiIsIm9vYkVsdHMiLCJjb250ZW50Iiwic3dhcFNwZWMiLCJzd2FwT3B0aW9ucyIsImFjdGl2ZUVsdCIsInNlbGVjdGlvbkluZm8iLCJvb2JTZWxlY3RWYWx1ZXMiLCJvb2JTZWxlY3RWYWx1ZSIsInRlbXBsYXRlIiwibmV3RnJhZ21lbnQiLCJuZXdBY3RpdmVFbHQiLCJmb2N1c09wdGlvbnMiLCJkb1NldHRsZSIsInRhc2siLCJhbmNob3JUYXJnZXQiLCJ4aHIiLCJoZWFkZXIiLCJ0cmlnZ2VyQm9keSIsInRyaWdnZXJzIiwiZXZlbnROYW1lIiwiZGV0YWlsIiwiZXZlbnROYW1lcyIsInRva2VucyIsInBvc2l0aW9uIiwic3RhcnRQb3NpdGlvbiIsInN0YXJ0Q2hhciIsInN5bWJvbCIsInRva2VuIiwibGFzdCIsInBhcmFtTmFtZSIsImJyYWNrZXRDb3VudCIsImNvbmRpdGlvbmFsU291cmNlIiwiY29uZGl0aW9uRnVuY3Rpb24iLCJleHBsaWNpdFRyaWdnZXIiLCJjYWNoZSIsInRyaWdnZXJTcGVjcyIsImluaXRpYWxMZW5ndGgiLCJldmVyeSIsImV2ZW50RmlsdGVyIiwidHJpZ2dlclNwZWMiLCJmcm9tX2FyZyIsImhhbmRsZXIiLCJzcGVjIiwibm9kZURhdGEiLCJyYXdBdHRyaWJ1dGUiLCJzb3VyY2UiLCJleHBsaWNpdENhbmNlbCIsImVsZW1lbnREYXRhIiwiZWx0c1RvTGlzdGVuT24iLCJlbHRUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbkRhdGEiLCJldmVudExpc3RlbmVyIiwiZXZlbnREYXRhIiwibG9hZCIsImV4cGxpY2l0QWN0aW9uIiwib2JzZXJ2ZXJPcHRpb25zIiwiZW50cmllcyIsImF0dHJpYnV0ZXMiLCJlbGVtZW50cyIsIml0ZXIiLCJib29zdGVkU2VsZWN0b3IiLCJleHRlbnNpb25TZWxlY3RvcnMiLCJzZWxlY3RvcnMiLCJzIiwiZm9ybSIsImNvZGUiLCJsaXN0ZW5lciIsImFmdGVyT25Qb3NpdGlvbiIsIm5leHRDaGFyIiwidG9EbyIsIm1zZyIsImV2ZW50UmVzdWx0Iiwia2ViYWJOYW1lIiwia2ViYWJlZEV2ZW50Iiwicm9vdEVsdCIsImlubmVySFRNTCIsInRpdGxlIiwic2Nyb2xsIiwiaGlzdG9yeUNhY2hlIiwibmV3SGlzdG9yeUl0ZW0iLCJjbGFzc05hbWUiLCJjbG9uZSIsImRpc2FibGVIaXN0b3J5Q2FjaGUiLCJ0YXNrcyIsInJlcXVlc3QiLCJkZXRhaWxzIiwiaGlzdG9yeUVsZW1lbnQiLCJjYWNoZWQiLCJpbmRpY2F0b3JzIiwiaWMiLCJkaXNhYmxlZEVsdHMiLCJkaXNhYmxlZEVsZW1lbnQiLCJkaXNhYmxlZCIsInByb2Nlc3NlZCIsImZvcm1EYXRhIiwidiIsInZhbHVlcyIsImVycm9ycyIsInZhbGlkYXRlIiwiaW5wdXQiLCJyZWNlaXZlciIsImRvbm9yIiwicHJpb3JpdHlGb3JtRGF0YSIsImJ1dHRvbiIsImluY2x1ZGVzIiwiZGVzY2VuZGFudCIsInJldHVyblN0ciIsInJlYWxWYWx1ZSIsInByb21wdCIsImhlYWRlcnMiLCJpbnB1dFZhbHVlcyIsInBhcmFtc1ZhbHVlIiwibmV3VmFsdWVzIiwic3dhcEluZm9PdmVycmlkZSIsInN3YXBJbmZvIiwic3BsaXQiLCJzcGxpdFNwZWMiLCJzY3JvbGxWYWwiLCJzZWxlY3RvclZhbCIsInNob3dWYWwiLCJmb2N1c1Njcm9sbFZhbCIsImZpbHRlcmVkUGFyYW1ldGVycyIsImVuY29kZWRQYXJhbWV0ZXJzIiwiZmlyc3QiLCJldmFsQXNEZWZhdWx0IiwiZXZhbHVhdGVWYWx1ZSIsInZhcnNWYWx1ZXMiLCJ0b0V2YWwiLCJkZWZhdWx0VmFsIiwiZXhwcmVzc2lvblZhcnMiLCJoZWFkZXJWYWx1ZSIsInJlZ2V4cCIsInJlcXVlc3RDb25maWciLCJzYW1lSG9zdCIsIm9iaiIsImFycmF5IiwiaW5kZXgiLCJwcm9wIiwiZXRjIiwiY29uZmlybWVkIiwicmVzb2x2ZSIsInJlamVjdCIsInByb21pc2UiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJyZXNwb25zZUhhbmRsZXIiLCJzZWxlY3QiLCJlbHREYXRhIiwic3VibWl0dGVyIiwiYnV0dG9uUGF0aCIsImJ1dHRvblZlcmIiLCJjb25maXJtUXVlc3Rpb24iLCJza2lwQ29uZmlybWF0aW9uIiwic3luY0VsdCIsInN5bmNTdHJhdGVneSIsInF1ZXVlU3RyYXRlZ3kiLCJhYm9ydGFibGUiLCJzeW5jU3RyaW5ncyIsImVuZFJlcXVlc3RMb2NrIiwicHJvbXB0UXVlc3Rpb24iLCJwcm9tcHRSZXNwb25zZSIsInJhd0Zvcm1EYXRhIiwiYWxsRm9ybURhdGEiLCJmaWx0ZXJlZEZvcm1EYXRhIiwicmVxdWVzdEF0dHJWYWx1ZXMiLCJlbHRJc0Jvb3N0ZWQiLCJ1c2VVcmxQYXJhbXMiLCJzcGxpdFBhdGgiLCJwYXRoTm9BbmNob3IiLCJhbmNob3IiLCJmaW5hbFBhdGgiLCJyZXNwb25zZUluZm8iLCJoaWVyYXJjaHkiLCJkaXNhYmxlRWx0cyIsInNlY29uZGFyeVRyaWdnZXJFbHQiLCJwYXJlbnRFbHRJbkhpZXJhcmNoeSIsInBhcmFtcyIsInBhdGhGcm9tSGVhZGVycyIsInR5cGVGcm9tSGVhZGVycyIsInJlcXVlc3RQYXRoIiwicmVzcG9uc2VQYXRoIiwicHVzaFVybCIsInJlcGxhY2VVcmwiLCJlbGVtZW50SXNCb29zdGVkIiwic2F2ZVR5cGUiLCJyZXNwb25zZUhhbmRsaW5nQ29uZmlnIiwic3RhdHVzIiwicmVnRXhwIiwicmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQiLCJ0aXRsZUVsdCIsInJlc3BvbnNlSW5mb1NlbGVjdCIsInJlZGlyZWN0UGF0aCIsInJlZGlyZWN0U3dhcFNwZWMiLCJzaG91bGRSZWZyZXNoIiwiaGlzdG9yeVVwZGF0ZSIsInJlc3BvbnNlSGFuZGxpbmciLCJzaG91bGRTd2FwIiwiaXNFcnJvciIsImlnbm9yZVRpdGxlIiwic2VsZWN0T3ZlcnJpZGUiLCJzd2FwT3ZlcnJpZGUiLCJzZXJ2ZXJSZXNwb25zZSIsInNldHRsZVJlc29sdmUiLCJzZXR0bGVSZWplY3QiLCJzZWxlY3RPT0IiLCJkb1N3YXAiLCJmaW5hbEVsdCIsInNob3VsZFRyYW5zaXRpb24iLCJzZXR0bGVQcm9taXNlIiwiaW5uZXJEb1N3YXAiLCJhcGkiLCJ0ZXh0IiwicGFyYW1ldGVycyIsImV4dGVuc2lvbnNUb1JldHVybiIsImV4dGVuc2lvbnNUb0lnbm9yZSIsImV4dGVuc2lvbnNGb3JFbGVtZW50IiwiZXh0ZW5zaW9uTmFtZSIsImZuIiwibm9uY2VBdHRyaWJ1dGUiLCJtZXRhQ29uZmlnIiwiYm9keSIsInJlc3RvcmVkRWx0cyIsIm9yaWdpbmFsUG9wc3RhdGUiLCJodG14X2VzbV9kZWZhdWx0IiwiZGVwZW5kc09uIiwicGF0aFNwZWMiLCJkZXBlbmRlbmN5UGF0aCIsInVybFBhdGgiLCJkZXBlbmRlbmN5RWxlbWVudCIsInBhdGhFbGVtZW50IiwicmVmcmVzaFBhdGgiLCJlbHRzV2l0aERlcHMiLCJjb25maWciLCJrZWJhYkV2ZW50TmFtZSIsImlnbm9yZWRFdmVudHMiLCJtYWtlRXZlbnQiLCJ0cmlnZ2VyQ2hpbGRyZW4iLCJ0cmlnZ2VyZWQiLCJuZXdFdmVudCIsImF0dHJQcmVmaXgiLCJzdGFydHNXaXRoIiwiZ2V0UmVzcENvZGVUYXJnZXQiLCJyZXNwQ29kZU51bWJlciIsInJlc3BDb2RlIiwiYXR0clBvc3NpYmlsaXRpZXMiLCJhdHRyVmFsdWUiLCJoYW5kbGVFcnJvckZsYWciLCJhcGlSZWYiLCJsYXN0VmVyc2lvbiIsImVuYWJsZWQiLCJldmVudFNvdXJjZSIsIm1lc3NhZ2UiLCJyZWxvYWQiLCJldmFsRnVuY1JlZ2V4IiwicmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMiLCJtYXRjaGVzIiwiZWxlIiwic3BsaXRPbldoaXRlc3BhY2UiLCJnZXRMZWdhY3lXZWJzb2NrZXRVUkwiLCJsZWdhY3lTU0VWYWx1ZSIsImVuc3VyZVdlYlNvY2tldCIsInNvY2tldEVsdCIsIndzc1NvdXJjZSIsImxlZ2FjeVNvdXJjZSIsImJhc2VfcGFydCIsInNvY2tldFdyYXBwZXIiLCJjcmVhdGVXZWJzb2NrZXRXcmFwcGVyIiwiY3JlYXRlV2ViU29ja2V0IiwibWF5YmVDbG9zZVdlYlNvY2tldFNvdXJjZSIsImNoaWxkcmVuIiwic29ja2V0RnVuYyIsIndyYXBwZXIiLCJzZW5kRWx0IiwicXVldWVkSXRlbSIsInNvY2tldCIsImdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5IiwiZXZlbnRzIiwiayIsImVuc3VyZVdlYlNvY2tldFNlbmQiLCJsZWdhY3lBdHRyaWJ1dGUiLCJ3ZWJTb2NrZXRQYXJlbnQiLCJoYXNXZWJTb2NrZXQiLCJwcm9jZXNzV2ViU29ja2V0U2VuZCIsInRzIiwicmF3UGFyYW1ldGVycyIsImFsbFBhcmFtZXRlcnMiLCJzZW5kQ29uZmlnIiwidG9TZW5kIiwicmV0cnlDb3VudCIsImV4cCIsInNvY2siLCJ3YXRjaFVybCIsImxhc3RVcmwiLCJfIiwibmV3VXJsIiwib25VcmxDaGFuZ2UiLCJoYXNNYXRjaCIsImRlZmF1bHRLZXkiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLEVBQUFBLENBQVEsVUFBVyxDQUlyQixJQUFNLElBQU8sQ0FBQSxDQUlYLE9BQVEsSUFFUixDQUFBLE9BQUEsQ0FBUyxLQUVULEVBQUksQ0FBQSxJQUFBLENBRUosSUFBSyxJQUVMLENBQUEsT0FBQSxDQUFTLEtBRVQsSUFBTSxDQUFBLElBQUEsQ0FHTixJQUFNLENBQUEsSUFBQSxDQUVOLE9BQVMsQ0FBQSxJQUFBLENBRVQsUUFBUyxJQVVULENBQUEsTUFBQSxDQUFRLFNBQVNDLENBQUtDLENBQUFBLENBQUFBLENBQU0sQ0FFMUIsT0FEb0IsY0FBQSxDQUFlRCxDQUFLQyxDQUFBQSxDQUFBQSxFQUFRLE1BQU0sQ0FBQSxDQUNuQyxNQUNyQixDQUdBLENBQUEsTUFBQSxDQUFRLEtBRVIsUUFBVSxDQUFBLElBQUEsQ0FFVixZQUFhLElBRWIsQ0FBQSxXQUFBLENBQWEsSUFFYixDQUFBLFNBQUEsQ0FBVyxJQUVYLENBQUEsSUFBQSxDQUFNLEtBR04sZUFBaUIsQ0FBQSxJQUFBLENBRWpCLGdCQUFpQixJQUdqQixDQUFBLE1BQUEsQ0FBUSxLQUVSLE9BQVMsQ0FBQSxJQUFBLENBT1QsTUFBUSxDQUFBLElBQUEsQ0FRUixNQUFRLENBQUEsQ0FNTixlQUFnQixDQU1oQixDQUFBLENBQUEsZ0JBQUEsQ0FBa0IsR0FLbEIsb0JBQXNCLENBQUEsQ0FBQSxDQUFBLENBTXRCLGlCQUFrQixXQU1sQixDQUFBLGdCQUFBLENBQWtCLENBTWxCLENBQUEsa0JBQUEsQ0FBb0IsRUFNcEIsQ0FBQSxzQkFBQSxDQUF3QixHQU14QixjQUFnQixDQUFBLGdCQUFBLENB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Q0FBQUEsQ0FBQUEsQ0FBSUEsRUFBRyxZQUFhaEMsQ0FBQUEsQ0FBSSxHQUFLLEVBQUksQ0FBQSxDQUN6QyxVQUFXLFdBQ1gsQ0FBQSxTQUFBLENBQVcsQ0FDWCxDQUFBLFdBQUEsQ0FBYSxDQUNmLENBQUMsRUFDRHFaLENBQVcsQ0FBQSxDQUFBLENBQUEsQ0FDWCxLQUNGLENBQ0YsQ0FFRixHQUFJLENBQUNBLENBQUFBLENBQVUsQ0FDYixJQUFJQyxDQUFhdFgsQ0FBQUEsQ0FBQUEsQ0FBRyxhQUFhLHFCQUFxQixDQUFBLENBQ2xEc1gsR0FDRjFFLENBQUssQ0FBQSxJQUFBLENBQ0g1UyxFQUNBQSxDQUFHLENBQUEsWUFBQSxDQUFhLHNCQUF5QnNYLENBQUFBLENBQVUsQ0FBSyxFQUFBLEVBQUEsQ0FDeEQsQ0FBRSxTQUFXLENBQUEsV0FBQSxDQUFhLFVBQVcsQ0FBRyxDQUFBLFdBQUEsQ0FBYSxDQUFFLENBQ3pELEVBRUosQ0FDRixDQUFDLEVBQ0giLCJmaWxlIjoiaHRtZ28uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaHRteCA9IChmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnXG5cbiAgLy8gUHVibGljIEFQSVxuICBjb25zdCBodG14ID0ge1xuICAgIC8vIFRzYyBtYWRuZXNzIGhlcmUsIGFzc2lnbmluZyB0aGUgZnVuY3Rpb25zIGRpcmVjdGx5IHJlc3VsdHMgaW4gYW4gaW52YWxpZCBUeXBlU2NyaXB0IG91dHB1dCwgYnV0IHJlYXNzaWduaW5nIGlzIGZpbmVcbiAgICAvKiBFdmVudCBwcm9jZXNzaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygb25Mb2FkSGVscGVyfSAqL1xuICAgIG9uTG9hZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwcm9jZXNzTm9kZX0gKi9cbiAgICBwcm9jZXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZEV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9mZjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0cmlnZ2VyRXZlbnR9ICovXG4gICAgdHJpZ2dlcjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhamF4SGVscGVyfSAqL1xuICAgIGFqYXg6IG51bGwsXG4gICAgLyogRE9NIHF1ZXJ5aW5nIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kfSAqL1xuICAgIGZpbmQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZEFsbH0gKi9cbiAgICBmaW5kQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGNsb3Nlc3R9ICovXG4gICAgY2xvc2VzdDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbnB1dCB2YWx1ZXMgdGhhdCB3b3VsZCByZXNvbHZlIGZvciBhIGdpdmVuIGVsZW1lbnQgdmlhIHRoZSBodG14IHZhbHVlIHJlc29sdXRpb24gbWVjaGFuaXNtXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN2YWx1ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0IHRoZSBlbGVtZW50IHRvIHJlc29sdmUgdmFsdWVzIG9uXG4gICAgICogQHBhcmFtIHtIdHRwVmVyYn0gdHlwZSB0aGUgcmVxdWVzdCB0eXBlIChlLmcuICoqZ2V0Kiogb3IgKipwb3N0KiopIG5vbi1HRVQncyB3aWxsIGluY2x1ZGUgdGhlIGVuY2xvc2luZyBmb3JtIG9mIHRoZSBlbGVtZW50LiBEZWZhdWx0cyB0byAqKnBvc3QqKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgdmFsdWVzOiBmdW5jdGlvbihlbHQsIHR5cGUpIHtcbiAgICAgIGNvbnN0IGlucHV0VmFsdWVzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB0eXBlIHx8ICdwb3N0JylcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlcy52YWx1ZXNcbiAgICB9LFxuICAgIC8qIERPTSBtYW5pcHVsYXRpb24gaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZENsYXNzVG9FbGVtZW50fSAqL1xuICAgIGFkZENsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdG9nZ2xlQ2xhc3NPbkVsZW1lbnR9ICovXG4gICAgdG9nZ2xlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdGFrZUNsYXNzRm9yRWxlbWVudH0gKi9cbiAgICB0YWtlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygc3dhcH0gKi9cbiAgICBzd2FwOiBudWxsLFxuICAgIC8qIEV4dGVuc2lvbiBlbnRyeXBvaW50cyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGRlZmluZUV4dGVuc2lvbn0gKi9cbiAgICBkZWZpbmVFeHRlbnNpb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXh0ZW5zaW9ufSAqL1xuICAgIHJlbW92ZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dBbGx9ICovXG4gICAgbG9nQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ05vbmV9ICovXG4gICAgbG9nTm9uZTogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKipcbiAgICAgKiBUaGUgbG9nZ2VyIGh0bXggdXNlcyB0byBsb2cgd2l0aFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nZ2VyXG4gICAgICovXG4gICAgbG9nZ2VyOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHkgaG9sZGluZyB0aGUgY29uZmlndXJhdGlvbiBodG14IHVzZXMgYXQgcnVudGltZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB1c2luZyBhIFttZXRhIHRhZ10oaHR0cHM6Ly9odG14Lm9yZy9kb2NzLyNjb25maWcpIGlzIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHRoZXNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjb25maWdcbiAgICAgKi9cbiAgICBjb25maWc6IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byB1c2UgaGlzdG9yeS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUVuYWJsZWQ6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8ga2VlcCBpbiAqKmxvY2FsU3RvcmFnZSoqIGZvciBoaXN0b3J5IHN1cHBvcnQuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlDYWNoZVNpemU6IDEwLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICByZWZyZXNoT25IaXN0b3J5TWlzczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IHN3YXAgc3R5bGUgdG8gdXNlIGlmICoqW2h4LXN3YXBdKGh0dHBzOi8vaHRteC5vcmcvYXR0cmlidXRlcy9oeC1zd2FwKSoqIGlzIG9taXR0ZWQuXG4gICAgICAgKiBAdHlwZSBIdG14U3dhcFN0eWxlXG4gICAgICAgKiBAZGVmYXVsdCAnaW5uZXJIVE1MJ1xuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcFN0eWxlOiAnaW5uZXJIVE1MJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiByZWNlaXZpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGRvaW5nIHRoZSBzd2FwLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwRGVsYXk6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gY29tcGxldGluZyB0aGUgY29udGVudCBzd2FwIGFuZCBzZXR0bGluZyBhdHRyaWJ1dGVzLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U2V0dGxlRGVsYXk6IDIwLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0cnVlLCBodG14IHdpbGwgaW5qZWN0IGEgc21hbGwgYW1vdW50IG9mIENTUyBpbnRvIHRoZSBwYWdlIHRvIG1ha2UgaW5kaWNhdG9ycyBpbnZpc2libGUgdW5sZXNzIHRoZSAqKmh0bXgtaW5kaWNhdG9yKiogY2xhc3MgaXMgcHJlc2VudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaW5jbHVkZUluZGljYXRvclN0eWxlczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIGluZGljYXRvcnMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1pbmRpY2F0b3InXG4gICAgICAgKi9cbiAgICAgIGluZGljYXRvckNsYXNzOiAnaHRteC1pbmRpY2F0b3InLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdHJpZ2dlcmluZyBlbGVtZW50cyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXJlcXVlc3QnXG4gICAgICAgKi9cbiAgICAgIHJlcXVlc3RDbGFzczogJ2h0bXgtcmVxdWVzdCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byB0ZW1wb3JhcmlseSBwbGFjZSBvbiBlbGVtZW50cyB0aGF0IGh0bXggaGFzIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWFkZGVkJ1xuICAgICAgICovXG4gICAgICBhZGRlZENsYXNzOiAnaHRteC1hZGRlZCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc2V0dGxpbmcnXG4gICAgICAgKi9cbiAgICAgIHNldHRsaW5nQ2xhc3M6ICdodG14LXNldHRsaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHN3YXBwaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zd2FwcGluZydcbiAgICAgICAqL1xuICAgICAgc3dhcHBpbmdDbGFzczogJ2h0bXgtc3dhcHBpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvd3MgdGhlIHVzZSBvZiBldmFsLWxpa2UgZnVuY3Rpb25hbGl0eSBpbiBodG14LCB0byBlbmFibGUgKipoeC12YXJzKiosIHRyaWdnZXIgY29uZGl0aW9ucyAmIHNjcmlwdCB0YWcgZXZhbHVhdGlvbi4gQ2FuIGJlIHNldCB0byAqKmZhbHNlKiogZm9yIENTUCBjb21wYXRpYmlsaXR5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd0V2YWw6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byBmYWxzZSwgZGlzYWJsZXMgdGhlIGludGVycHJldGF0aW9uIG9mIHNjcmlwdCB0YWdzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd1NjcmlwdFRhZ3M6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHNjcmlwdHMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVNjcmlwdE5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc3R5bGVzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTdHlsZU5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGF0dHJpYnV0ZXMgdG8gc2V0dGxlIGR1cmluZyB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgICAgICogQGRlZmF1bHQgWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXVxuICAgICAgICovXG4gICAgICBhdHRyaWJ1dGVzVG9TZXR0bGU6IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93IGNyb3NzLXNpdGUgQWNjZXNzLUNvbnRyb2wgcmVxdWVzdHMgdXNpbmcgY3JlZGVudGlhbHMgc3VjaCBhcyBjb29raWVzLCBhdXRob3JpemF0aW9uIGhlYWRlcnMgb3IgVExTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgdGltZW91dDogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgKipnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheSoqIGZvciByZWNvbm5lY3RpbmcgYWZ0ZXIgdW5leHBlY3RlZCBjb25uZWN0aW9uIGxvc3MgYnkgdGhlIGV2ZW50IGNvZGUgKipBYm5vcm1hbCBDbG9zdXJlKiosICoqU2VydmljZSBSZXN0YXJ0Kiogb3IgKipUcnkgQWdhaW4gTGF0ZXIqKi5cbiAgICAgICAqIEB0eXBlIHsnZnVsbC1qaXR0ZXInIHwgKChyZXRyeUNvdW50Om51bWJlcikgPT4gbnVtYmVyKX1cbiAgICAgICAqIEBkZWZhdWx0IFwiZnVsbC1qaXR0ZXJcIlxuICAgICAgICovXG4gICAgICB3c1JlY29ubmVjdERlbGF5OiAnZnVsbC1qaXR0ZXInLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdHlwZSBvZiBiaW5hcnkgZGF0YSBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICogQHR5cGUgQmluYXJ5VHlwZVxuICAgICAgICogQGRlZmF1bHQgJ2Jsb2InXG4gICAgICAgKi9cbiAgICAgIHdzQmluYXJ5VHlwZTogJ2Jsb2InLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJ1xuICAgICAgICovXG4gICAgICBkaXNhYmxlU2VsZWN0b3I6ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgeydhdXRvJyB8ICdpbnN0YW50JyB8ICdzbW9vdGgnfVxuICAgICAgICogQGRlZmF1bHQgJ2luc3RhbnQnXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoZSBmb2N1c2VkIGVsZW1lbnQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdmlldy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRGb2N1c1Njcm9sbDogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBpbmNsdWRlIGEgY2FjaGUtYnVzdGluZyBwYXJhbWV0ZXIgaW4gR0VUIHJlcXVlc3RzIHRvIGF2b2lkIGNhY2hpbmcgcGFydGlhbCByZXNwb25zZXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdldENhY2hlQnVzdGVyUGFyYW06IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgaHRteCB3aWxsIHVzZSB0aGUgVmlldyBUcmFuc2l0aW9uIEFQSSB3aGVuIHN3YXBwaW5nIGluIG5ldyBjb250ZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2xvYmFsVmlld1RyYW5zaXRpb25zOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogaHRteCB3aWxsIGZvcm1hdCByZXF1ZXN0cyB3aXRoIHRoZXNlIG1ldGhvZHMgYnkgZW5jb2RpbmcgdGhlaXIgcGFyYW1ldGVycyBpbiB0aGUgVVJMLCBub3QgdGhlIHJlcXVlc3QgYm9keVxuICAgICAgICogQHR5cGUgeyhIdHRwVmVyYilbXX1cbiAgICAgICAqIEBkZWZhdWx0IFsnZ2V0JywgJ2RlbGV0ZSddXG4gICAgICAgKi9cbiAgICAgIG1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zOiBbJ2dldCcsICdkZWxldGUnXSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGRpc2FibGVzIGh0bXgtYmFzZWQgcmVxdWVzdHMgdG8gbm9uLW9yaWdpbiBob3N0cy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHNlbGZSZXF1ZXN0c09ubHk6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBub3QgdXBkYXRlIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQgd2hlbiBhIHRpdGxlIHRhZyBpcyBmb3VuZCBpbiBuZXcgY29udGVudFxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgaWdub3JlVGl0bGU6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgb2YgYSBib29zdGVkIGVsZW1lbnQgaXMgc2Nyb2xsZWQgaW50byB0aGUgdmlld3BvcnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEludG9WaWV3T25Cb29zdDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNhY2hlIHRvIHN0b3JlIGV2YWx1YXRlZCB0cmlnZ2VyIHNwZWNpZmljYXRpb25zIGludG8uXG4gICAgICAgKiBZb3UgbWF5IGRlZmluZSBhIHNpbXBsZSBvYmplY3QgdG8gdXNlIGEgbmV2ZXItY2xlYXJpbmcgY2FjaGUsIG9yIGltcGxlbWVudCB5b3VyIG93biBzeXN0ZW0gdXNpbmcgYSBbcHJveHkgb2JqZWN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSlcbiAgICAgICAqIEB0eXBlIHtPYmplY3R8bnVsbH1cbiAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAqL1xuICAgICAgdHJpZ2dlclNwZWNzQ2FjaGU6IG51bGwsXG4gICAgICAvKiogQHR5cGUgYm9vbGVhbiAqL1xuICAgICAgZGlzYWJsZUluaGVyaXRhbmNlOiBmYWxzZSxcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1tdICovXG4gICAgICByZXNwb25zZUhhbmRsaW5nOiBbXG4gICAgICAgIHsgY29kZTogJzIwNCcsIHN3YXA6IGZhbHNlIH0sXG4gICAgICAgIHsgY29kZTogJ1syM10uLicsIHN3YXA6IHRydWUgfSxcbiAgICAgICAgeyBjb2RlOiAnWzQ1XS4uJywgc3dhcDogZmFsc2UsIGVycm9yOiB0cnVlIH1cbiAgICAgIF0sXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gcHJvY2VzcyBPT0Igc3dhcHMgb24gZWxlbWVudHMgdGhhdCBhcmUgbmVzdGVkIHdpdGhpbiB0aGUgbWFpbiByZXNwb25zZSBlbGVtZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd05lc3RlZE9vYlN3YXBzOiB0cnVlXG4gICAgfSxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwYXJzZUludGVydmFsfSAqL1xuICAgIHBhcnNlSW50ZXJ2YWw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgaW50ZXJuYWxFdmFsfSAqL1xuICAgIF86IG51bGwsXG4gICAgdmVyc2lvbjogJzIuMC4yJ1xuICB9XG4gIC8vIFRzYyBtYWRuZXNzIHBhcnQgMlxuICBodG14Lm9uTG9hZCA9IG9uTG9hZEhlbHBlclxuICBodG14LnByb2Nlc3MgPSBwcm9jZXNzTm9kZVxuICBodG14Lm9uID0gYWRkRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC5vZmYgPSByZW1vdmVFdmVudExpc3RlbmVySW1wbFxuICBodG14LnRyaWdnZXIgPSB0cmlnZ2VyRXZlbnRcbiAgaHRteC5hamF4ID0gYWpheEhlbHBlclxuICBodG14LmZpbmQgPSBmaW5kXG4gIGh0bXguZmluZEFsbCA9IGZpbmRBbGxcbiAgaHRteC5jbG9zZXN0ID0gY2xvc2VzdFxuICBodG14LnJlbW92ZSA9IHJlbW92ZUVsZW1lbnRcbiAgaHRteC5hZGRDbGFzcyA9IGFkZENsYXNzVG9FbGVtZW50XG4gIGh0bXgucmVtb3ZlQ2xhc3MgPSByZW1vdmVDbGFzc0Zyb21FbGVtZW50XG4gIGh0bXgudG9nZ2xlQ2xhc3MgPSB0b2dnbGVDbGFzc09uRWxlbWVudFxuICBodG14LnRha2VDbGFzcyA9IHRha2VDbGFzc0ZvckVsZW1lbnRcbiAgaHRteC5zd2FwID0gc3dhcFxuICBodG14LmRlZmluZUV4dGVuc2lvbiA9IGRlZmluZUV4dGVuc2lvblxuICBodG14LnJlbW92ZUV4dGVuc2lvbiA9IHJlbW92ZUV4dGVuc2lvblxuICBodG14LmxvZ0FsbCA9IGxvZ0FsbFxuICBodG14LmxvZ05vbmUgPSBsb2dOb25lXG4gIGh0bXgucGFyc2VJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWxcbiAgaHRteC5fID0gaW50ZXJuYWxFdmFsXG5cbiAgY29uc3QgaW50ZXJuYWxBUEkgPSB7XG4gICAgYWRkVHJpZ2dlckhhbmRsZXIsXG4gICAgYm9keUNvbnRhaW5zLFxuICAgIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSxcbiAgICBmaW5kVGhpc0VsZW1lbnQsXG4gICAgZmlsdGVyVmFsdWVzLFxuICAgIHN3YXAsXG4gICAgaGFzQXR0cmlidXRlLFxuICAgIGdldEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0TWF0Y2gsXG4gICAgZ2V0RXhwcmVzc2lvblZhcnMsXG4gICAgZ2V0SGVhZGVycyxcbiAgICBnZXRJbnB1dFZhbHVlcyxcbiAgICBnZXRJbnRlcm5hbERhdGEsXG4gICAgZ2V0U3dhcFNwZWNpZmljYXRpb24sXG4gICAgZ2V0VHJpZ2dlclNwZWNzLFxuICAgIGdldFRhcmdldCxcbiAgICBtYWtlRnJhZ21lbnQsXG4gICAgbWVyZ2VPYmplY3RzLFxuICAgIG1ha2VTZXR0bGVJbmZvLFxuICAgIG9vYlN3YXAsXG4gICAgcXVlcnlTZWxlY3RvckV4dCxcbiAgICBzZXR0bGVJbW1lZGlhdGVseSxcbiAgICBzaG91bGRDYW5jZWwsXG4gICAgdHJpZ2dlckV2ZW50LFxuICAgIHRyaWdnZXJFcnJvckV2ZW50LFxuICAgIHdpdGhFeHRlbnNpb25zXG4gIH1cblxuICBjb25zdCBWRVJCUyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCddXG4gIGNvbnN0IFZFUkJfU0VMRUNUT1IgPSBWRVJCUy5tYXAoZnVuY3Rpb24odmVyYikge1xuICAgIHJldHVybiAnW2h4LScgKyB2ZXJiICsgJ10sIFtkYXRhLWh4LScgKyB2ZXJiICsgJ10nXG4gIH0pLmpvaW4oJywgJylcblxuICBjb25zdCBIRUFEX1RBR19SRUdFWCA9IG1ha2VUYWdSZWdFeCgnaGVhZCcpXG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXRpbGl0aWVzXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge1JlZ0V4cH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VUYWdSZWdFeCh0YWcsIGdsb2JhbCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYDwke3RhZ30oXFxcXHNbXj5dKj58PikoW1xcXFxzXFxcXFNdKj8pPFxcXFwvJHt0YWd9PmAsXG4gICAgICBnbG9iYWwgPyAnZ2ltJyA6ICdpbScpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIGludGVydmFsIHN0cmluZyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBodG14IGRvZXMuIFVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IGhhdmUgdGltaW5nLXJlbGF0ZWQgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQ2F1dGlvbjogQWNjZXB0cyBhbiBpbnQgZm9sbG93ZWQgYnkgZWl0aGVyICoqcyoqIG9yICoqbXMqKi4gQWxsIG90aGVyIHZhbHVlcyB1c2UgKipwYXJzZUZsb2F0KipcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcGFyc2VJbnRlcnZhbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRpbWluZyBzdHJpbmdcbiAgICogQHJldHVybnMge251bWJlcnx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUludGVydmFsKHN0cikge1xuICAgIGlmIChzdHIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgbGV0IGludGVydmFsID0gTmFOXG4gICAgaWYgKHN0ci5zbGljZSgtMikgPT0gJ21zJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMikpXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdzJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMFxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAnbScpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDAgKiA2MFxuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNOYU4oaW50ZXJ2YWwpID8gdW5kZWZpbmVkIDogaW50ZXJ2YWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmF3QXR0cmlidXRlKGVsdCwgbmFtZSkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGVsdC5nZXRBdHRyaWJ1dGUobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIC8vIHJlc29sdmUgd2l0aCBib3RoIGh4IGFuZCBkYXRhLWh4IHByZWZpeGVzXG4gIGZ1bmN0aW9uIGhhc0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gISFlbHQuaGFzQXR0cmlidXRlICYmIChlbHQuaGFzQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpIHx8XG4gICAgICBlbHQuaGFzQXR0cmlidXRlKCdkYXRhLScgKyBxdWFsaWZpZWROYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuIGdldFJhd0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHx8IGdldFJhd0F0dHJpYnV0ZShlbHQsICdkYXRhLScgKyBxdWFsaWZpZWROYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudEVsdChlbHQpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIGlmICghcGFyZW50ICYmIGVsdC5wYXJlbnROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkgcmV0dXJuIGVsdC5wYXJlbnROb2RlXG4gICAgcmV0dXJuIHBhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICAgIHJldHVybiBkb2N1bWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtOb2RlfERvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Um9vdE5vZGUoZWx0LCBnbG9iYWwpIHtcbiAgICByZXR1cm4gZWx0LmdldFJvb3ROb2RlID8gZWx0LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IGdsb2JhbCB9KSA6IGdldERvY3VtZW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0geyhlOk5vZGUpID0+IGJvb2xlYW59IGNvbmRpdGlvblxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0TWF0Y2goZWx0LCBjb25kaXRpb24pIHtcbiAgICB3aGlsZSAoZWx0ICYmICFjb25kaXRpb24oZWx0KSkge1xuICAgICAgZWx0ID0gcGFyZW50RWx0KGVsdClcbiAgICB9XG5cbiAgICByZXR1cm4gZWx0IHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGluaXRpYWxFbGVtZW50XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gYW5jZXN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoaW5pdGlhbEVsZW1lbnQsIGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBkaXNpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1kaXNpbmhlcml0JylcbiAgICB2YXIgaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtaW5oZXJpdCcpXG4gICAgaWYgKGluaXRpYWxFbGVtZW50ICE9PSBhbmNlc3Rvcikge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmRpc2FibGVJbmhlcml0YW5jZSkge1xuICAgICAgICBpZiAoaW5oZXJpdCAmJiAoaW5oZXJpdCA9PT0gJyonIHx8IGluaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpc2luaGVyaXQgJiYgKGRpc2luaGVyaXQgPT09ICcqJyB8fCBkaXNpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICByZXR1cm4gJ3Vuc2V0J1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBsZXQgY2xvc2VzdEF0dHIgPSBudWxsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuICEhKGNsb3Nlc3RBdHRyID0gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoZWx0LCBhc0VsZW1lbnQoZSksIGF0dHJpYnV0ZU5hbWUpKVxuICAgIH0pXG4gICAgaWYgKGNsb3Nlc3RBdHRyICE9PSAndW5zZXQnKSB7XG4gICAgICByZXR1cm4gY2xvc2VzdEF0dHJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMgZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRWYXJpYWJsZVxuICAgIGNvbnN0IG1hdGNoZXNGdW5jdGlvbiA9IGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgKGVsdC5tYXRjaGVzIHx8IGVsdC5tYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWx0LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbHQub01hdGNoZXNTZWxlY3RvcilcbiAgICByZXR1cm4gISFtYXRjaGVzRnVuY3Rpb24gJiYgbWF0Y2hlc0Z1bmN0aW9uLmNhbGwoZWx0LCBzZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdGFydFRhZyhzdHIpIHtcbiAgICBjb25zdCB0YWdNYXRjaGVyID0gLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pXG4gICAgY29uc3QgbWF0Y2ggPSB0YWdNYXRjaGVyLmV4ZWMoc3RyKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSFRNTChyZXNwKSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpXG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcCwgJ3RleHQvaHRtbCcpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBlbHQpIHtcbiAgICB3aGlsZSAoZWx0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsdC5jaGlsZE5vZGVzWzBdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge0hUTUxTY3JpcHRFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZHVwbGljYXRlU2NyaXB0KHNjcmlwdCkge1xuICAgIGNvbnN0IG5ld1NjcmlwdCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICBmb3JFYWNoKHNjcmlwdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBuZXdTY3JpcHQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICB9KVxuICAgIG5ld1NjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdC50ZXh0Q29udGVudFxuICAgIG5ld1NjcmlwdC5hc3luYyA9IGZhbHNlXG4gICAgaWYgKGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlKSB7XG4gICAgICBuZXdTY3JpcHQubm9uY2UgPSBodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZVxuICAgIH1cbiAgICByZXR1cm4gbmV3U2NyaXB0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpIHtcbiAgICByZXR1cm4gc2NyaXB0Lm1hdGNoZXMoJ3NjcmlwdCcpICYmIChzY3JpcHQudHlwZSA9PT0gJ3RleHQvamF2YXNjcmlwdCcgfHwgc2NyaXB0LnR5cGUgPT09ICdtb2R1bGUnIHx8IHNjcmlwdC50eXBlID09PSAnJylcbiAgfVxuXG4gIC8qKlxuICAgKiB3ZSBoYXZlIHRvIG1ha2UgbmV3IGNvcGllcyBvZiBzY3JpcHQgdGFncyB0aGF0IHdlIGFyZSBnb2luZyB0byBpbnNlcnQgYmVjYXVzZVxuICAgKiBTT01FIGJyb3dzZXJzIChub3Qgc2F5aW5nIHdobywgYnV0IGl0IGludm9sdmVzIGFuIGVsZW1lbnQgYW5kIGFuIGFuaW1hbCkgZG9uJ3RcbiAgICogZXhlY3V0ZSBzY3JpcHRzIGNyZWF0ZWQgaW4gPHRlbXBsYXRlPiB0YWdzIHdoZW4gdGhleSBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXG4gICAqIGFuZCBhbGwgdGhlIG90aGVycyBkbyBsbWFvXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpIHtcbiAgICBBcnJheS5mcm9tKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpKS5mb3JFYWNoKC8qKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHQgKi8gKHNjcmlwdCkgPT4ge1xuICAgICAgaWYgKGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSkge1xuICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBzY3JpcHQucGFyZW50Tm9kZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3U2NyaXB0LCBzY3JpcHQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7RG9jdW1lbnRGcmFnbWVudCAmIHt0aXRsZT86IHN0cmluZ319IERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGVcbiAgICogQGRlc2NyaXB0aW9uICBhIGRvY3VtZW50IGZyYWdtZW50IHJlcHJlc2VudGluZyB0aGUgcmVzcG9uc2UgSFRNTCwgaW5jbHVkaW5nXG4gICAqIGEgYHRpdGxlYCBwcm9wZXJ0eSBmb3IgYW55IHRpdGxlIGluZm9ybWF0aW9uIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2UgSFRNTFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VGcmFnbWVudChyZXNwb25zZSkge1xuICAgIC8vIHN0cmlwIGhlYWQgdGFnIHRvIGRldGVybWluZSBzaGFwZSBvZiByZXNwb25zZSB3ZSBhcmUgZGVhbGluZyB3aXRoXG4gICAgY29uc3QgcmVzcG9uc2VXaXRoTm9IZWFkID0gcmVzcG9uc2UucmVwbGFjZShIRUFEX1RBR19SRUdFWCwgJycpXG4gICAgY29uc3Qgc3RhcnRUYWcgPSBnZXRTdGFydFRhZyhyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi9cbiAgICBsZXQgZnJhZ21lbnRcbiAgICBpZiAoc3RhcnRUYWcgPT09ICdodG1sJykge1xuICAgICAgLy8gaWYgaXQgaXMgYSBmdWxsIGRvY3VtZW50LCBwYXJzZSBpdCBhbmQgcmV0dXJuIHRoZSBib2R5XG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIGlmIChzdGFydFRhZyA9PT0gJ2JvZHknKSB7XG4gICAgICAvLyBwYXJzZSBib2R5IHcvbyB3cmFwcGluZyBpbiB0ZW1wbGF0ZVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgbm9uLWJvZHkgcGFydGlhbCBIVE1MIGNvbnRlbnQsIHNvIHdyYXAgaXQgaW4gYSB0ZW1wbGF0ZSB0byBtYXhpbWl6ZSBwYXJzaW5nIGZsZXhpYmlsaXR5XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwoJzxib2R5Pjx0ZW1wbGF0ZSBjbGFzcz1cImludGVybmFsLWh0bXgtd3JhcHBlclwiPicgKyByZXNwb25zZVdpdGhOb0hlYWQgKyAnPC90ZW1wbGF0ZT48L2JvZHk+JylcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKGRvYy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpLmNvbnRlbnQpXG4gICAgICAvLyBleHRyYWN0IHRpdGxlIGludG8gZnJhZ21lbnQgZm9yIGxhdGVyIHByb2Nlc3NpbmdcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG5cbiAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyB3ZSBzdXBwb3J0IGEgdGl0bGUgdGFnIGF0IHRoZSByb290IGxldmVsIG9mIG5vbi1ib2R5IHJlc3BvbnNlcywgc28gd2UgbmVlZCB0byBoYW5kbGUgaXRcbiAgICAgIHZhciB0aXRsZUVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbGVtZW50ICYmIHRpdGxlRWxlbWVudC5wYXJlbnROb2RlID09PSBmcmFnbWVudCkge1xuICAgICAgICB0aXRsZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgICAgZnJhZ21lbnQudGl0bGUgPSB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93U2NyaXB0VGFncykge1xuICAgICAgICBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBzY3JpcHQgdGFncyBpZiBzY3JpcHRzIGFyZSBkaXNhYmxlZFxuICAgICAgICBmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKS5mb3JFYWNoKChzY3JpcHQpID0+IHNjcmlwdC5yZW1vdmUoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVDYWxsKGZ1bmMpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgZnVuYygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBpc1R5cGUobywgdHlwZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIEZ1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIE9iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUmF3T2JqZWN0KG8pIHtcbiAgICByZXR1cm4gaXNUeXBlKG8sICdPYmplY3QnKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9uSGFuZGxlclxuICAgKiBAcHJvcGVydHkgeyhrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwKXxzdHJpbmd9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RlbmVySW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IG9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14Tm9kZUludGVybmFsRGF0YVxuICAgKiBFbGVtZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbml0SGFzaF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYm9vc3RlZF1cbiAgICogQHByb3BlcnR5IHtPbkhhbmRsZXJbXX0gW29uSGFuZGxlcnNdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHByb3BlcnR5IHtMaXN0ZW5lckluZm9bXX0gW2xpc3RlbmVySW5mb3NdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhbmNlbGxlZF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdHJpZ2dlcmVkT25jZV1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheWVkXVxuICAgKiBAcHJvcGVydHkge251bWJlcnxudWxsfSBbdGhyb3R0bGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFzdFZhbHVlXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2FkZWRdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJiXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwb2xsaW5nXVxuICAgKiBAcHJvcGVydHkge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8bnVsbH0gW2xhc3RCdXR0b25DbGlja2VkXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3JlcXVlc3RDb3VudF1cbiAgICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0gW3hocl1cbiAgICogQHByb3BlcnR5IHsoKCkgPT4gdm9pZClbXX0gW3F1ZXVlZFJlcXVlc3RzXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthYm9ydGFibGVdXG4gICAqXG4gICAqIEV2ZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IFt0cmlnZ2VyU3BlY11cbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldFtdfSBbaGFuZGxlZEZvcl1cbiAgICovXG5cbiAgLyoqXG4gICAqIGdldEludGVybmFsRGF0YSByZXRyaWV2ZXMgXCJwcml2YXRlXCIgZGF0YSBzdG9yZWQgYnkgaHRteCB3aXRoaW4gYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEV2ZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxEYXRhKGVsdCkge1xuICAgIGNvbnN0IGRhdGFQcm9wID0gJ2h0bXgtaW50ZXJuYWwtZGF0YSdcbiAgICBsZXQgZGF0YSA9IGVsdFtkYXRhUHJvcF1cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGRhdGEgPSBlbHRbZGF0YVByb3BdID0ge31cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0FycmF5IGNvbnZlcnRzIGFuIEFycmF5TGlrZSBvYmplY3QgaW50byBhIHJlYWwgYXJyYXkuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHJldHVybnMge1RbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkoYXJyKSB7XG4gICAgY29uc3QgcmV0dXJuQXJyID0gW11cbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXR1cm5BcnIucHVzaChhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5BcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1RbXXxOYW1lZE5vZGVNYXB8SFRNTENvbGxlY3Rpb258SFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb258QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHBhcmFtIHsoVCkgPT4gdm9pZH0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gZm9yRWFjaChhcnIsIGZ1bmMpIHtcbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBmdW5jKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsZWRJbnRvVmlldyhlbCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGVsZW1Ub3AgPSByZWN0LnRvcFxuICAgIGNvbnN0IGVsZW1Cb3R0b20gPSByZWN0LmJvdHRvbVxuICAgIHJldHVybiBlbGVtVG9wIDwgd2luZG93LmlubmVySGVpZ2h0ICYmIGVsZW1Cb3R0b20gPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gYm9keUNvbnRhaW5zKGVsdCkge1xuICAgIC8vIElFIEZpeFxuICAgIGNvbnN0IHJvb3ROb2RlID0gZWx0LmdldFJvb3ROb2RlICYmIGVsdC5nZXRSb290Tm9kZSgpXG4gICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QpIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMocm9vdE5vZGUuaG9zdClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHNwbGl0T25XaGl0ZXNwYWNlKHRyaWdnZXIpIHtcbiAgICByZXR1cm4gdHJpZ2dlci50cmltKCkuc3BsaXQoL1xccysvKVxuICB9XG5cbiAgLyoqXG4gICAqIG1lcmdlT2JqZWN0cyB0YWtlcyBhbGwgdGhlIGtleXMgZnJvbVxuICAgKiBvYmoyIGFuZCBkdXBsaWNhdGVzIHRoZW0gaW50byBvYmoxXG4gICAqIEB0ZW1wbGF0ZSBUMVxuICAgKiBAdGVtcGxhdGUgVDJcbiAgICogQHBhcmFtIHtUMX0gb2JqMVxuICAgKiBAcGFyYW0ge1QyfSBvYmoyXG4gICAqIEByZXR1cm5zIHtUMSAmIFQyfVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmoyKSB7XG4gICAgICBpZiAob2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgcmV0dXJuIG9iajFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30galN0cmluZ1xuICAgKiBAcmV0dXJucyB7YW55fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUpTT04oalN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShqU3RyaW5nKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dFcnJvcihlcnJvcilcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkge1xuICAgIGNvbnN0IHRlc3QgPSAnaHRteDpsb2NhbFN0b3JhZ2VUZXN0J1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KVxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoKVxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBwYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCB1bmxlc3MgaW5kZXggcGFnZVxuICAgICAgaWYgKCEoL15cXC8kLy50ZXN0KHBhdGgpKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBiZSBraW5kIHRvIElFMTEsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBVUkwoKVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHVibGljIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gaW50ZXJuYWxFdmFsKHN0cikge1xuICAgIHJldHVybiBtYXliZUV2YWwoZ2V0RG9jdW1lbnQoKS5ib2R5LCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBldmFsKHN0cilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjYWxsYmFjayBmb3IgdGhlICoqaHRteDpsb2FkKiogZXZlbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvY2VzcyBuZXcgY29udGVudCwgZm9yIGV4YW1wbGUgaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50IHdpdGggYSBqYXZhc2NyaXB0IGxpYnJhcnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25Mb2FkXG4gICAqXG4gICAqIEBwYXJhbSB7KGVsdDogTm9kZSkgPT4gdm9pZH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGNhbGwgb24gbmV3bHkgbG9hZGVkIGNvbnRlbnRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvbkxvYWRIZWxwZXIoY2FsbGJhY2spIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0bXgub24oJ2h0bXg6bG9hZCcsIC8qKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldnQgKi8gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjYWxsYmFjayhldnQuZGV0YWlsLmVsdClcbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIExvZyBhbGwgaHRteCBldmVudHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dBbGxcbiAgICovXG4gIGZ1bmN0aW9uIGxvZ0FsbCgpIHtcbiAgICBodG14LmxvZ2dlciA9IGZ1bmN0aW9uKGVsdCwgZXZlbnQsIGRhdGEpIHtcbiAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LCBlbHQsIGRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nTm9uZSgpIHtcbiAgICBodG14LmxvZ2dlciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudCBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZEFsbFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudHMgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD59XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQWxsKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRBbGwoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgV2luZG93XG4gICAqL1xuICBmdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHdpbmRvd1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsdCwgZGVsYXkpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUVsZW1lbnQoZWx0KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RWx0KGVsdCkucmVtb3ZlQ2hpbGQoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0h0bWxFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqIEByZXR1cm4ge1BhcmVudE5vZGV8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzUGFyZW50Tm9kZShlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFkZHMgYSBjbGFzcyB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWRkQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgY2xhc3MgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byBhZGRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSBjbGFzcyBpcyBhZGRlZFxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eiwgZGVsYXkpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0LmNsYXNzTGlzdCAmJiBlbHQuY2xhc3NMaXN0LmFkZChjbGF6eilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsYXNzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gbm9kZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgY2xhc3MgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgY2xhc3MgaXMgcmVtb3ZlZClcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQobm9kZSwgY2xhenosIGRlbGF5KSB7XG4gICAgbGV0IGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KG5vZGUpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShjbGF6eilcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGNsYXNzZXMgbGVmdCwgcmVtb3ZlIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGdpdmVuIGNsYXNzIG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdG9nZ2xlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRvZ2dsZSB0aGUgY2xhc3Mgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0b2dnbGVcbiAgICovXG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzT25FbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBlbHQuY2xhc3NMaXN0LnRvZ2dsZShjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSBpdHMgc2libGluZ3MsIHNvIHRoYXQgYW1vbmcgaXRzIHNpYmxpbmdzLCBvbmx5IHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Rha2VDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRha2UgdGhlIGNsYXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdGFrZVxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNsYXNzRm9yRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZm9yRWFjaChlbHQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXp6KVxuICAgIH0pXG4gICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGVsdCksIGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjbG9zZXN0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzIHBhcmVudGFnZSwgaW5jbHVzaXZlIG9mIHRoZSBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2Nsb3Nlc3RcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIHNlbGVjdG9yIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBmaW5kXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZXN0KGVsdCwgc2VsZWN0b3IpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmIChlbHQgJiYgZWx0LmNsb3Nlc3QpIHtcbiAgICAgIHJldHVybiBlbHQuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyByZW1vdmUgd2hlbiBJRSBnb2VzIGF3YXlcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGVsdCA9PSBudWxsIHx8IG1hdGNoZXMoZWx0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbHQgPSBlbHQgJiYgYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSlcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwcmVmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzdWZmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgPT09IHN1ZmZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICBjb25zdCB0cmltbWVkU2VsZWN0b3IgPSBzZWxlY3Rvci50cmltKClcbiAgICBpZiAoc3RhcnRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICc8JykgJiYgZW5kc1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnLz4nKSkge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3Rvci5zdWJzdHJpbmcoMSwgdHJpbW1lZFNlbGVjdG9yLmxlbmd0aCAtIDIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfEVsZW1lbnR8RG9jdW1lbnR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLCBnbG9iYWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoc2VsZWN0b3IuaW5kZXhPZignY2xvc2VzdCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtjbG9zZXN0KGFzRWxlbWVudChlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOCkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2ZpbmQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbZmluZChhc1BhcmVudE5vZGUoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ25leHQnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLm5leHRFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ25leHQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkZvcndhcmRRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncHJldmlvdXMnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdwcmV2aW91cyAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuQmFja3dhcmRzUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudF1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnd2luZG93Jykge1xuICAgICAgcmV0dXJuIFt3aW5kb3ddXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2JvZHknKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50LmJvZHldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3Jvb3QnKSB7XG4gICAgICByZXR1cm4gW2dldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZ2xvYmFsICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLnNsaWNlKDcpLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdG9BcnJheShhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkZvcndhcmRRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5CYWNrd2FyZHNRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd31cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3RvcilbMF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZ2V0RG9jdW1lbnQoKS5ib2R5LCBlbHRPclNlbGVjdG9yKVswXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge0V2ZW50VGFyZ2V0fSBUXG4gICAqIEBwYXJhbSB7VHxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtUfSBbY29udGV4dF1cbiAgICogQHJldHVybnMge0VsZW1lbnR8VHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVRhcmdldChlbHRPclNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZpbmQoYXNQYXJlbnROb2RlKGNvbnRleHQpIHx8IGRvY3VtZW50LCBlbHRPclNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7a2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcHxzdHJpbmd9IEFueUV2ZW50TmFtZVxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXZlbnRBcmdzXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICAgKiBAcHJvcGVydHkge0FueUV2ZW50TmFtZX0gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxBbnlFdmVudE5hbWV9IGFyZzFcbiAgICogQHBhcmFtIHtBbnlFdmVudE5hbWV8RXZlbnRMaXN0ZW5lcn0gYXJnMlxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXVxuICAgKiBAcmV0dXJucyB7RXZlbnRBcmdzfVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oYXJnMikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogZ2V0RG9jdW1lbnQoKS5ib2R5LFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMSksXG4gICAgICAgIGxpc3RlbmVyOiBhcmcyXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogcmVzb2x2ZVRhcmdldChhcmcxKSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzIpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnM1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBsaXN0ZW5lciB0byB8IHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3IgfCB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICBjb25zdCBiID0gaXNGdW5jdGlvbihhcmcyKVxuICAgIHJldHVybiBiID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvZmZcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oYXJnMikgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTm9kZSBwcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3QgRFVNTVlfRUxUID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdvdXRwdXQnKSAvLyBkdW1teSBlbGVtZW50IGZvciBiYWQgc2VsZWN0b3JzXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ck5hbWVcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgYXR0ck5hbWUpIHtcbiAgICBjb25zdCBhdHRyVGFyZ2V0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0ck5hbWUpXG4gICAgaWYgKGF0dHJUYXJnZXQpIHtcbiAgICAgIGlmIChhdHRyVGFyZ2V0ID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIFtmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyTmFtZSldXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgYXR0clRhcmdldClcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsb2dFcnJvcignVGhlIHNlbGVjdG9yIFwiJyArIGF0dHJUYXJnZXQgKyAnXCIgb24gJyArIGF0dHJOYW1lICsgJyByZXR1cm5lZCBubyBtYXRjaGVzIScpXG4gICAgICAgICAgcmV0dXJuIFtEVU1NWV9FTFRdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBhc0VsZW1lbnQoZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoYXNFbGVtZW50KGVsdCksIGF0dHJpYnV0ZSkgIT0gbnVsbFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VGFyZ2V0KGVsdCkge1xuICAgIGNvbnN0IHRhcmdldFN0ciA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKVxuICAgIGlmICh0YXJnZXRTdHIpIHtcbiAgICAgIGlmICh0YXJnZXRTdHIgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRhcmdldFN0cilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAoZGF0YS5ib29zdGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUobmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXNUb1NldHRsZSA9IGh0bXguY29uZmlnLmF0dHJpYnV0ZXNUb1NldHRsZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlc1RvU2V0dGxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmFtZSA9PT0gYXR0cmlidXRlc1RvU2V0dGxlW2ldKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VUb1xuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlRnJvbVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvbmVBdHRyaWJ1dGVzKG1lcmdlVG8sIG1lcmdlRnJvbSkge1xuICAgIGZvckVhY2gobWVyZ2VUby5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoIW1lcmdlRnJvbS5oYXNBdHRyaWJ1dGUoYXR0ci5uYW1lKSAmJiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKG1lcmdlRnJvbS5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpIHtcbiAgICBjb25zdCBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyh0YXJnZXQpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzSW5saW5lU3dhcChzd2FwU3R5bGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFN0eWxlID09PSAnb3V0ZXJIVE1MJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvb2JWYWx1ZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9vYkVsZW1lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGxldCBzZWxlY3RvciA9ICcjJyArIGdldFJhd0F0dHJpYnV0ZShvb2JFbGVtZW50LCAnaWQnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFN0eWxlICovXG4gICAgbGV0IHN3YXBTdHlsZSA9ICdvdXRlckhUTUwnXG4gICAgaWYgKG9vYlZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKG9vYlZhbHVlLmluZGV4T2YoJzonKSA+IDApIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlLnN1YnN0cigwLCBvb2JWYWx1ZS5pbmRleE9mKCc6JykpXG4gICAgICBzZWxlY3RvciA9IG9vYlZhbHVlLnN1YnN0cihvb2JWYWx1ZS5pbmRleE9mKCc6JykgKyAxLCBvb2JWYWx1ZS5sZW5ndGgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICBpZiAodGFyZ2V0cykge1xuICAgICAgZm9yRWFjaChcbiAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgICAgbGV0IGZyYWdtZW50XG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudENsb25lID0gb29iRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICBmcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQob29iRWxlbWVudENsb25lKVxuICAgICAgICAgIGlmICghaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBhc1BhcmVudE5vZGUob29iRWxlbWVudENsb25lKSAvLyBpZiB0aGlzIGlzIG5vdCBhbiBpbmxpbmUgc3dhcCwgd2UgdXNlIHRoZSBjb250ZW50IG9mIHRoZSBub2RlLCBub3QgdGhlIG5vZGUgaXRzZWxmXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlU3dhcERldGFpbHMgPSB7IHNob3VsZFN3YXA6IHRydWUsIHRhcmdldCwgZnJhZ21lbnQgfVxuICAgICAgICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6b29iQmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICAgICAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgICAgICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgICAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCB0YXJnZXQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14Om9vYkFmdGVyU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6b29iRXJyb3JOb1RhcmdldCcsIHsgY29udGVudDogb29iRWxlbWVudCB9KVxuICAgIH1cbiAgICByZXR1cm4gb29iVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudCkge1xuICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ1toeC1wcmVzZXJ2ZV0sIFtkYXRhLWh4LXByZXNlcnZlXScpLCBmdW5jdGlvbihwcmVzZXJ2ZWRFbHQpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0QXR0cmlidXRlVmFsdWUocHJlc2VydmVkRWx0LCAnaWQnKVxuICAgICAgY29uc3Qgb2xkRWx0ID0gZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgIGlmIChvbGRFbHQgIT0gbnVsbCkge1xuICAgICAgICBwcmVzZXJ2ZWRFbHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQob2xkRWx0LCBwcmVzZXJ2ZWRFbHQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyksIGZ1bmN0aW9uKG5ld05vZGUpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UmF3QXR0cmlidXRlKG5ld05vZGUsICdpZCcpXG4gICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkSWQgPSBpZC5yZXBsYWNlKFwiJ1wiLCBcIlxcXFwnXCIpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYWcgPSBuZXdOb2RlLnRhZ05hbWUucmVwbGFjZSgnOicsICdcXFxcOicpXG4gICAgICAgIGNvbnN0IHBhcmVudEVsdCA9IGFzUGFyZW50Tm9kZShwYXJlbnROb2RlKVxuICAgICAgICBjb25zdCBvbGROb2RlID0gcGFyZW50RWx0ICYmIHBhcmVudEVsdC5xdWVyeVNlbGVjdG9yKG5vcm1hbGl6ZWRUYWcgKyBcIltpZD0nXCIgKyBub3JtYWxpemVkSWQgKyBcIiddXCIpXG4gICAgICAgIGlmIChvbGROb2RlICYmIG9sZE5vZGUgIT09IHBhcmVudEVsdCkge1xuICAgICAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBuZXdOb2RlLmNsb25lTm9kZSgpXG4gICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG9sZE5vZGUpXG4gICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG5ld0F0dHJpYnV0ZXMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBjaGlsZFxuICAgKiBAcmV0dXJucyB7SHRteFNldHRsZVRhc2t9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlQWpheExvYWRUYXNrKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHByb2Nlc3NOb2RlKGFzRWxlbWVudChjaGlsZCkpXG4gICAgICBwcm9jZXNzRm9jdXMoYXNQYXJlbnROb2RlKGNoaWxkKSlcbiAgICAgIHRyaWdnZXJFdmVudChjaGlsZCwgJ2h0bXg6bG9hZCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gY2hpbGRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NGb2N1cyhjaGlsZCkge1xuICAgIGNvbnN0IGF1dG9mb2N1cyA9ICdbYXV0b2ZvY3VzXSdcbiAgICBjb25zdCBhdXRvRm9jdXNlZEVsdCA9IGFzSHRtbEVsZW1lbnQobWF0Y2hlcyhjaGlsZCwgYXV0b2ZvY3VzKSA/IGNoaWxkIDogY2hpbGQucXVlcnlTZWxlY3RvcihhdXRvZm9jdXMpKVxuICAgIGlmIChhdXRvRm9jdXNlZEVsdCAhPSBudWxsKSB7XG4gICAgICBhdXRvRm9jdXNlZEVsdC5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge05vZGV9IGluc2VydEJlZm9yZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydEJlZm9yZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIHdoaWxlIChmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZFxuICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGNoaWxkKSwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbnNlcnRCZWZvcmUpXG4gICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJhc2VkIG9uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2h5YW1hbW90by9mZDQzNTUwNWQyOWViZmEzZDk3MTZmZDJiZThkNDJmMCxcbiAgICogZGVyaXZlZCBmcm9tIEphdmEncyBzdHJpbmcgaGFzaGNvZGUgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaGFzaFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nSGFzaChzdHJpbmcsIGhhc2gpIHtcbiAgICBsZXQgY2hhciA9IDBcbiAgICB3aGlsZSAoY2hhciA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBzdHJpbmcuY2hhckNvZGVBdChjaGFyKyspIHwgMCAvLyBiaXR3aXNlIG9yIGVuc3VyZXMgd2UgaGF2ZSBhIDMyLWJpdCBpbnRcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYXR0cmlidXRlSGFzaChlbHQpIHtcbiAgICBsZXQgaGFzaCA9IDBcbiAgICAvLyBJRSBmaXhcbiAgICBpZiAoZWx0LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWx0LmF0dHJpYnV0ZXNbaV1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZS52YWx1ZSkgeyAvLyBvbmx5IGluY2x1ZGUgYXR0cmlidXRlcyB3LyBhY3R1YWwgdmFsdWVzIChlbXB0eSBpcyBzYW1lIGFzIG5vbi1leGlzdGVudClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUubmFtZSwgaGFzaClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUudmFsdWUsIGhhc2gpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE9uSGFuZGxlcnMoZWx0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZm8gPSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1tpXVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChlbHQsIGhhbmRsZXJJbmZvLmV2ZW50LCBoYW5kbGVySW5mby5saXN0ZW5lcilcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE5vZGUoZWxlbWVudCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbGVtZW50KVxuICAgIGlmIChpbnRlcm5hbERhdGEudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVybmFsRGF0YS50aW1lb3V0KVxuICAgIH1cbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MpIHtcbiAgICAgIGZvckVhY2goaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MsIGZ1bmN0aW9uKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8ub24pIHtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChpbmZvLm9uLCBpbmZvLnRyaWdnZXIsIGluZm8ubGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWxlbWVudClcbiAgICBmb3JFYWNoKE9iamVjdC5rZXlzKGludGVybmFsRGF0YSksIGZ1bmN0aW9uKGtleSkgeyBkZWxldGUgaW50ZXJuYWxEYXRhW2tleV0gfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuVXBFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKVxuICAgIGRlSW5pdE5vZGUoZWxlbWVudClcbiAgICAvLyBAdHMtaWdub3JlIElFMTEgY29kZVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikgeyAvLyBJRVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yRWFjaChlbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkgeyBjbGVhblVwRWxlbWVudChjaGlsZCkgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiB0YXJnZXQudGFnTmFtZSA9PT0gJ0JPRFknKSB7IC8vIHNwZWNpYWwgY2FzZSB0aGUgYm9keSB0byBpbm5lckhUTUwgYmVjYXVzZSBEb2N1bWVudEZyYWdtZW50cyBjYW4ndCBjb250YWluIGEgYm9keSBlbHQgdW5mb3J0dW5hdGVseVxuICAgICAgcmV0dXJuIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtOb2RlfSAqL1xuICAgIGxldCBuZXdFbHRcbiAgICBjb25zdCBlbHRCZWZvcmVOZXdDb250ZW50ID0gdGFyZ2V0LnByZXZpb3VzU2libGluZ1xuICAgIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChlbHRCZWZvcmVOZXdDb250ZW50ID09IG51bGwpIHtcbiAgICAgIG5ld0VsdCA9IHBhcmVudEVsdCh0YXJnZXQpLmZpcnN0Q2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWx0ID0gZWx0QmVmb3JlTmV3Q29udGVudC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBzZXR0bGVJbmZvLmVsdHMgPSBzZXR0bGVJbmZvLmVsdHMuZmlsdGVyKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUgIT09IHRhcmdldCB9KVxuICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgbmV3bHkgYWRkZWQgY29udGVudCBhbmQgYWRkIGFsbCBlbGVtZW50cyB0byB0aGUgc2V0dGxlIGluZm8gc28gd2UgdHJpZ2dlclxuICAgIC8vIGV2ZW50cyBwcm9wZXJseSBvbiB0aGVtXG4gICAgd2hpbGUgKG5ld0VsdCAmJiBuZXdFbHQgIT09IHRhcmdldCkge1xuICAgICAgaWYgKG5ld0VsdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgc2V0dGxlSW5mby5lbHRzLnB1c2gobmV3RWx0KVxuICAgICAgfVxuICAgICAgbmV3RWx0ID0gbmV3RWx0Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGFyZ2V0LnJlbW92ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgdGFyZ2V0LmZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBudWxsLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQubmV4dFNpYmxpbmcsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqL1xuICBmdW5jdGlvbiBzd2FwRGVsZXRlKHRhcmdldCkge1xuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICByZXR1cm4gcGFyZW50RWx0KHRhcmdldCkucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgY29uc3QgZmlyc3RDaGlsZCA9IHRhcmdldC5maXJzdENoaWxkXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBmaXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgd2hpbGUgKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICB9XG4gICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkKVxuICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHN3aXRjaCAoc3dhcFN0eWxlKSB7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdvdXRlckhUTUwnOlxuICAgICAgICBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJiZWdpbic6XG4gICAgICAgIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlYmVnaW4nOlxuICAgICAgICBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmVlbmQnOlxuICAgICAgICBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJlbmQnOlxuICAgICAgICBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBzd2FwRGVsZXRlKHRhcmdldClcbiAgICAgICAgcmV0dXJuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMoZWx0KVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBleHRlbnNpb25zW2ldXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZXh0LmhhbmRsZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0VsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGhhbmRsZVN3YXAgcmV0dXJucyBhbiBhcnJheSAobGlrZSkgb2YgZWxlbWVudHMsIHdlIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdFbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBuZXdFbGVtZW50c1tqXVxuICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3dhcFN0eWxlID09PSAnaW5uZXJIVE1MJykge1xuICAgICAgICAgIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2FwV2l0aFN0eWxlKGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICB2YXIgb29iRWx0cyA9IGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtc3dhcC1vb2JdLCBbZGF0YS1oeC1zd2FwLW9vYl0nKVxuICAgIGZvckVhY2gob29iRWx0cywgZnVuY3Rpb24ob29iRWxlbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93TmVzdGVkT29iU3dhcHMgfHwgb29iRWxlbWVudC5wYXJlbnRFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG9vYlZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUob29iRWxlbWVudCwgJ2h4LXN3YXAtb29iJylcbiAgICAgICAgaWYgKG9vYlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaHgtc3dhcC1vb2InKVxuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oeC1zd2FwLW9vYicpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gb29iRWx0cy5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBjb21wbGV0ZSBzd2FwcGluZyBwaXBlbGluZSwgaW5jbHVkaW5nOiBmb2N1cyBhbmQgc2VsZWN0aW9uIHByZXNlcnZhdGlvbixcbiAgICogdGl0bGUgdXBkYXRlcywgc2Nyb2xsLCBPT0Igc3dhcHBpbmcsIG5vcm1hbCBzd2FwcGluZyBhbmQgc2V0dGxpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKiBAcGFyYW0ge1N3YXBPcHRpb25zfSBbc3dhcE9wdGlvbnNdXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwKHRhcmdldCwgY29udGVudCwgc3dhcFNwZWMsIHN3YXBPcHRpb25zKSB7XG4gICAgaWYgKCFzd2FwT3B0aW9ucykge1xuICAgICAgc3dhcE9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIHRhcmdldCA9IHJlc29sdmVUYXJnZXQodGFyZ2V0KVxuXG4gICAgLy8gcHJlc2VydmUgZm9jdXMgYW5kIHNlbGVjdGlvblxuICAgIGNvbnN0IGFjdGl2ZUVsdCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICBsZXQgc2VsZWN0aW9uSW5mbyA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIHNlbGVjdGlvbkluZm8gPSB7XG4gICAgICAgIGVsdDogYWN0aXZlRWx0LFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXJ0OiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uU3RhcnQgOiBudWxsLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVuZDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvbkVuZCA6IG51bGxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzYWZhcmkgaXNzdWUgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9wbGF5d3JpZ2h0L2lzc3Vlcy81ODk0XG4gICAgfVxuICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpXG5cbiAgICAvLyBGb3IgdGV4dCBjb250ZW50IHN3YXBzLCBkb24ndCBwYXJzZSB0aGUgcmVzcG9uc2UgYXMgSFRNTCwganVzdCBpbnNlcnQgaXRcbiAgICBpZiAoc3dhcFNwZWMuc3dhcFN0eWxlID09PSAndGV4dENvbnRlbnQnKSB7XG4gICAgICB0YXJnZXQudGV4dENvbnRlbnQgPSBjb250ZW50XG4gICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBmcmFnbWVudCBhbmQgcHJvY2VzcyBpdFxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY29udGVudClcblxuICAgICAgc2V0dGxlSW5mby50aXRsZSA9IGZyYWdtZW50LnRpdGxlXG5cbiAgICAgIC8vIHNlbGVjdC1vb2Igc3dhcHNcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3RPT0IpIHtcbiAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWVzID0gc3dhcE9wdGlvbnMuc2VsZWN0T09CLnNwbGl0KCcsJylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvb2JTZWxlY3RWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlc1tpXS5zcGxpdCgnOicsIDIpXG4gICAgICAgICAgbGV0IGlkID0gb29iU2VsZWN0VmFsdWVbMF0udHJpbSgpXG4gICAgICAgICAgaWYgKGlkLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcoMSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBvb2JTZWxlY3RWYWx1ZVsxXSB8fCAndHJ1ZSdcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignIycgKyBpZClcbiAgICAgICAgICBpZiAob29iRWxlbWVudCkge1xuICAgICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9vYiBzd2Fwc1xuICAgICAgZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ3RlbXBsYXRlJyksIC8qKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlICovZnVuY3Rpb24odGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGZpbmRBbmRTd2FwT29iRWxlbWVudHModGVtcGxhdGUuY29udGVudCwgc2V0dGxlSW5mbykpIHtcbiAgICAgICAgICAvLyBBdm9pZCBwb2xsdXRpbmcgdGhlIERPTSB3aXRoIGVtcHR5IHRlbXBsYXRlcyB0aGF0IHdlcmUgb25seSB1c2VkIHRvIGVuY2Fwc3VsYXRlIG9vYiBzd2FwXG4gICAgICAgICAgdGVtcGxhdGUucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gbm9ybWFsIHN3YXBcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3QpIHtcbiAgICAgICAgY29uc3QgbmV3RnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3dhcE9wdGlvbnMuc2VsZWN0KSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIG5ld0ZyYWdtZW50LmFwcGVuZENoaWxkKG5vZGUpXG4gICAgICAgIH0pXG4gICAgICAgIGZyYWdtZW50ID0gbmV3RnJhZ21lbnRcbiAgICAgIH1cbiAgICAgIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KVxuICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3BlYy5zd2FwU3R5bGUsIHN3YXBPcHRpb25zLmNvbnRleHRFbGVtZW50LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cblxuICAgIC8vIGFwcGx5IHNhdmVkIGZvY3VzIGFuZCBzZWxlY3Rpb24gaW5mb3JtYXRpb24gdG8gc3dhcHBlZCBjb250ZW50XG4gICAgaWYgKHNlbGVjdGlvbkluZm8uZWx0ICYmXG4gICAgICAhYm9keUNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZWx0KSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSkge1xuICAgICAgY29uc3QgbmV3QWN0aXZlRWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSlcbiAgICAgIGNvbnN0IGZvY3VzT3B0aW9ucyA9IHsgcHJldmVudFNjcm9sbDogc3dhcFNwZWMuZm9jdXNTY3JvbGwgIT09IHVuZGVmaW5lZCA/ICFzd2FwU3BlYy5mb2N1c1Njcm9sbCA6ICFodG14LmNvbmZpZy5kZWZhdWx0Rm9jdXNTY3JvbGwgfVxuICAgICAgaWYgKG5ld0FjdGl2ZUVsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChzZWxlY3Rpb25JbmZvLnN0YXJ0ICYmIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uSW5mby5zdGFydCwgc2VsZWN0aW9uSW5mby5lbmQpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdGhlIHNldFNlbGVjdGlvblJhbmdlIG1ldGhvZCBpcyBwcmVzZW50IG9uIGZpZWxkcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQsIHNvIGp1c3QgbGV0IHRoaXMgZmFpbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdBY3RpdmVFbHQuZm9jdXMoZm9jdXNPcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG4gICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU3dhcCcsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICB9KVxuICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaykge1xuICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2soKVxuICAgIH1cblxuICAgIC8vIG1lcmdlIGluIG5ldyB0aXRsZSBhZnRlciBzd2FwIGJ1dCBiZWZvcmUgc2V0dGxlXG4gICAgaWYgKCFzd2FwU3BlYy5pZ25vcmVUaXRsZSkge1xuICAgICAgaGFuZGxlVGl0bGUoc2V0dGxlSW5mby50aXRsZSlcbiAgICB9XG5cbiAgICAvLyBzZXR0bGVcbiAgICBjb25zdCBkb1NldHRsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLnRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgIHRhc2suY2FsbCgpXG4gICAgICB9KVxuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTZXR0bGUnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgICB9KVxuXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYW5jaG9yKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclRhcmdldCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KCcjJyArIHN3YXBPcHRpb25zLmFuY2hvcikpXG4gICAgICAgIGlmIChhbmNob3JUYXJnZXQpIHtcbiAgICAgICAgICBhbmNob3JUYXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6ICdhdXRvJyB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVNjcm9sbFN0YXRlKHNldHRsZUluZm8uZWx0cywgc3dhcFNwZWMpXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaykge1xuICAgICAgICBzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3dhcFNwZWMuc2V0dGxlRGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU2V0dGxlLCBzd2FwU3BlYy5zZXR0bGVEZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TZXR0bGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCBoZWFkZXIsIGVsdCkge1xuICAgIGNvbnN0IHRyaWdnZXJCb2R5ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlcilcbiAgICBpZiAodHJpZ2dlckJvZHkuaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICBjb25zdCB0cmlnZ2VycyA9IHBhcnNlSlNPTih0cmlnZ2VyQm9keSlcbiAgICAgIGZvciAoY29uc3QgZXZlbnROYW1lIGluIHRyaWdnZXJzKSB7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgICAgbGV0IGRldGFpbCA9IHRyaWdnZXJzW2V2ZW50TmFtZV1cbiAgICAgICAgICBpZiAoaXNSYXdPYmplY3QoZGV0YWlsKSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWx0ID0gZGV0YWlsLnRhcmdldCAhPT0gdW5kZWZpbmVkID8gZGV0YWlsLnRhcmdldCA6IGVsdFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRhaWwgPSB7IHZhbHVlOiBkZXRhaWwgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBldmVudE5hbWVzID0gdHJpZ2dlckJvZHkuc3BsaXQoJywnKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZXNbaV0udHJpbSgpLCBbXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBXSElURVNQQUNFID0gL1xccy9cbiAgY29uc3QgV0hJVEVTUEFDRV9PUl9DT01NQSA9IC9bXFxzLF0vXG4gIGNvbnN0IFNZTUJPTF9TVEFSVCA9IC9bXyRhLXpBLVpdL1xuICBjb25zdCBTWU1CT0xfQ09OVCA9IC9bXyRhLXpBLVowLTldL1xuICBjb25zdCBTVFJJTkdJU0hfU1RBUlQgPSBbJ1wiJywgXCInXCIsICcvJ11cbiAgY29uc3QgTk9UX1dISVRFU1BBQ0UgPSAvW15cXHNdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVCA9IC9beyhdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQgPSAvW30pXS9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZVN0cmluZyhzdHIpIHtcbiAgICAvKiogQHR5cGUgc3RyaW5nW10gKi9cbiAgICBjb25zdCB0b2tlbnMgPSBbXVxuICAgIGxldCBwb3NpdGlvbiA9IDBcbiAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoKSB7XG4gICAgICBpZiAoU1lNQk9MX1NUQVJULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbikpKSB7XG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgd2hpbGUgKFNZTUJPTF9DT05ULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbiArIDEpKSkge1xuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIGlmIChTVFJJTkdJU0hfU1RBUlQuaW5kZXhPZihzdHIuY2hhckF0KHBvc2l0aW9uKSkgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2hhciA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoICYmIHN0ci5jaGFyQXQocG9zaXRpb24pICE9PSBzdGFydENoYXIpIHtcbiAgICAgICAgICBpZiAoc3RyLmNoYXJBdChwb3NpdGlvbikgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHRva2Vucy5wdXNoKHN5bWJvbClcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9uKytcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBsYXN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkge1xuICAgIHJldHVybiBTWU1CT0xfU1RBUlQuZXhlYyh0b2tlbi5jaGFyQXQoMCkpICYmXG4gICAgICB0b2tlbiAhPT0gJ3RydWUnICYmXG4gICAgICB0b2tlbiAhPT0gJ2ZhbHNlJyAmJlxuICAgICAgdG9rZW4gIT09ICd0aGlzJyAmJlxuICAgICAgdG9rZW4gIT09IHBhcmFtTmFtZSAmJlxuICAgICAgbGFzdCAhPT0gJy4nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Q29uZGl0aW9uYWxGdW5jdGlvbnxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCBwYXJhbU5hbWUpIHtcbiAgICBpZiAodG9rZW5zWzBdID09PSAnWycpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICBsZXQgYnJhY2tldENvdW50ID0gMVxuICAgICAgbGV0IGNvbmRpdGlvbmFsU291cmNlID0gJyByZXR1cm4gKGZ1bmN0aW9uKCcgKyBwYXJhbU5hbWUgKyAnKXsgcmV0dXJuICgnXG4gICAgICBsZXQgbGFzdCA9IG51bGxcbiAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1swXVxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBzaGlmdCBjYWxsLCBhbmQgdGhpbmtzIHdlJ3JlIGNvbXBhcmluZyB0aGUgc2FtZSB2YWx1ZSBoZXJlLCBpLmUuICdbJyB2cyAnXSdcbiAgICAgICAgaWYgKHRva2VuID09PSAnXScpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQtLVxuICAgICAgICAgIGlmIChicmFja2V0Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChsYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyAndHJ1ZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKX0pJ1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uRnVuY3Rpb24gPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oY29uZGl0aW9uYWxTb3VyY2UpKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pXG4gICAgICAgICAgICAgIGNvbmRpdGlvbkZ1bmN0aW9uLnNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlXG4gICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25GdW5jdGlvblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnN5bnRheDplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZTogY29uZGl0aW9uYWxTb3VyY2UgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdbJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudCsrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSkge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcoKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpID8gKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpIDogKHdpbmRvdy4nICsgdG9rZW4gKyAnKSknXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArIHRva2VuXG4gICAgICAgIH1cbiAgICAgICAgbGFzdCA9IHRva2Vucy5zaGlmdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gbWF0Y2hcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbCh0b2tlbnMsIG1hdGNoKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmICFtYXRjaC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHJlc3VsdCArPSB0b2tlbnMuc2hpZnQoKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKSB7XG4gICAgbGV0IHJlc3VsdFxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMCAmJiBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQpLnRyaW0oKVxuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY29uc3QgSU5QVVRfU0VMRUNUT1IgPSAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBsaWNpdFRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIGZvciB0cmlnZ2VyIHNwZWNzXG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSkge1xuICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXSAqL1xuICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVTdHJpbmcoZXhwbGljaXRUcmlnZ2VyKVxuICAgIGRvIHtcbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IHRva2Vucy5sZW5ndGhcbiAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLylcbiAgICAgIGlmICh0cmlnZ2VyICE9PSAnJykge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2V2ZXJ5Jykge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCBldmVyeSA9IHsgdHJpZ2dlcjogJ2V2ZXJ5JyB9XG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgZXZlcnkucG9sbEludGVydmFsID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLykpXG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgZXZlcnkuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaChldmVyeSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgdHJpZ2dlclNwZWMgPSB7IHRyaWdnZXIgfVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXSAhPT0gJywnKSB7XG4gICAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gJ2NoYW5nZWQnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnb25jZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMub25jZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdjb25zdW1lJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jb25zdW1lID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2RlbGF5JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5kZWxheSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZnJvbScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgaWYgKENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgICAgICBpZiAoZnJvbV9hcmcgPT09ICdjbG9zZXN0JyB8fCBmcm9tX2FyZyA9PT0gJ2ZpbmQnIHx8IGZyb21fYXJnID09PSAnbmV4dCcgfHwgZnJvbV9hcmcgPT09ICdwcmV2aW91cycpIHtcbiAgICAgICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgICAgICAvLyBgbmV4dGAgYW5kIGBwcmV2aW91c2AgYWxsb3cgYSBzZWxlY3Rvci1sZXNzIHN5bnRheFxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbV9hcmcgKz0gJyAnICsgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZnJvbSA9IGZyb21fYXJnXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGFyZ2V0JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50YXJnZXQgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Rocm90dGxlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50aHJvdHRsZSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncXVldWUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnF1ZXVlID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdyb290JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RocmVzaG9sZCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2godHJpZ2dlclNwZWMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSBpbml0aWFsTGVuZ3RoKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgIH0gd2hpbGUgKHRva2Vuc1swXSA9PT0gJywnICYmIHRva2Vucy5zaGlmdCgpKVxuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSA9IHRyaWdnZXJTcGVjc1xuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VHJpZ2dlclNwZWNzKGVsdCkge1xuICAgIGNvbnN0IGV4cGxpY2l0VHJpZ2dlciA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRyaWdnZXInKVxuICAgIGxldCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGlmIChleHBsaWNpdFRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gaHRteC5jb25maWcudHJpZ2dlclNwZWNzQ2FjaGVcbiAgICAgIHRyaWdnZXJTcGVjcyA9IChjYWNoZSAmJiBjYWNoZVtleHBsaWNpdFRyaWdnZXJdKSB8fCBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpXG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJTcGVjcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdzdWJtaXQnIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJidXR0b25cIl0sIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCBJTlBVVF9TRUxFQ1RPUikpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2hhbmdlJyB9XVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gY2FuY2VsUG9sbGluZyhlbHQpIHtcbiAgICBnZXRJbnRlcm5hbERhdGEoZWx0KS5jYW5jZWxsZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gc3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIG5vZGVEYXRhLnRpbWVvdXQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGJvZHlDb250YWlucyhlbHQpICYmIG5vZGVEYXRhLmNhbmNlbGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQoc3BlYywgZWx0LCBtYWtlRXZlbnQoJ2h4OnBvbGw6dHJpZ2dlcicsIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlYzogc3BlYyxcbiAgICAgICAgICB0YXJnZXQ6IGVsdFxuICAgICAgICB9KSkpIHtcbiAgICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpXG4gICAgICB9XG4gICAgfSwgc3BlYy5wb2xsSW50ZXJ2YWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MQW5jaG9yRWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNMb2NhbExpbmsoZWx0KSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uLmhvc3RuYW1lID09PSBlbHQuaG9zdG5hbWUgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpICE9PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGVsdElzRGlzYWJsZWQoZWx0KSB7XG4gICAgcmV0dXJuIGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqL1xuICBmdW5jdGlvbiBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgaWYgKChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBpc0xvY2FsTGluayhlbHQpICYmIChlbHQudGFyZ2V0ID09PSAnJyB8fCBlbHQudGFyZ2V0ID09PSAnX3NlbGYnKSkgfHwgKGVsdC50YWdOYW1lID09PSAnRk9STScgJiYgU3RyaW5nKGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKSkudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpKSB7XG4gICAgICBub2RlRGF0YS5ib29zdGVkID0gdHJ1ZVxuICAgICAgbGV0IHZlcmIsIHBhdGhcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgIHZlcmIgPSAnZ2V0J1xuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3QXR0cmlidXRlID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpXG4gICAgICAgIHZlcmIgPSByYXdBdHRyaWJ1dGUgPyByYXdBdHRyaWJ1dGUudG9Mb3dlckNhc2UoKSA6ICdnZXQnXG4gICAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgICB9XG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnYWN0aW9uJylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgfSwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZENhbmNlbChldnQsIG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChldnQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZXZ0LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwic3VibWl0XCJdLCBidXR0b24nKSAmJiBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGVsdC5ocmVmICYmXG4gICAgICAgIChlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT09ICcjJyB8fCBlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykuaW5kZXhPZignIycpICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fE1vdXNlRXZlbnR8S2V5Ym9hcmRFdmVudHxUb3VjaEV2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZXZ0LnR5cGUgPT09ICdjbGljaycgJiZcbiAgICAgIC8vIEB0cy1pZ25vcmUgdGhpcyB3aWxsIHJlc29sdmUgdG8gdW5kZWZpbmVkIGZvciBldmVudHMgdGhhdCBkb24ndCBkZWZpbmUgdGhvc2UgcHJvcGVydGllcywgd2hpY2ggaXMgZmluZVxuICAgICAgKGV2dC5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkge1xuICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXJcbiAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEZpbHRlci5jYWxsKGVsdCwgZXZ0KSAhPT0gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmVudEZpbHRlci5zb3VyY2VcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpldmVudEZpbHRlcjplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtleHBsaWNpdENhbmNlbF1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIGV4cGxpY2l0Q2FuY2VsKSB7XG4gICAgY29uc3QgZWxlbWVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIC8qKiBAdHlwZSB7KE5vZGV8V2luZG93KVtdfSAqL1xuICAgIGxldCBlbHRzVG9MaXN0ZW5PblxuICAgIGlmICh0cmlnZ2VyU3BlYy5mcm9tKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCB0cmlnZ2VyU3BlYy5mcm9tKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IFtlbHRdXG4gICAgfVxuICAgIC8vIHN0b3JlIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMsIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXkgY2hhbmdlXG4gICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uLmZvckVhY2goZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgfSlcbiAgICB9XG4gICAgZm9yRWFjaChlbHRzVG9MaXN0ZW5PbiwgZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGVsdFRvTGlzdGVuT24ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBsaWNpdENhbmNlbCB8fCBzaG91bGRDYW5jZWwoZXZ0LCBlbHQpKSB7XG4gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2dClcbiAgICAgICAgZXZlbnREYXRhLnRyaWdnZXJTcGVjID0gdHJpZ2dlclNwZWNcbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yID09IG51bGwpIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvciA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yLmluZGV4T2YoZWx0KSA8IDApIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvci5wdXNoKGVsdClcbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY29uc3VtZSkge1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50YXJnZXQgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKGFzRWxlbWVudChldnQudGFyZ2V0KSwgdHJpZ2dlclNwZWMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLm9uY2UpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgICAgICAgaWYgKGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEuZGVsYXllZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVsZW1lbnREYXRhLmRlbGF5ZWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocm90dGxlID4gMCkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gbnVsbFxuICAgICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy50aHJvdHRsZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLmRlbGF5ID4gMCkge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZGVsYXllZCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub2RlRGF0YS5saXN0ZW5lckluZm9zID09IG51bGwpIHtcbiAgICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcyA9IFtdXG4gICAgICB9XG4gICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyU3BlYy50cmlnZ2VyLFxuICAgICAgICBsaXN0ZW5lcjogZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgb246IGVsdFRvTGlzdGVuT25cbiAgICAgIH0pXG4gICAgICBlbHRUb0xpc3Rlbk9uLmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICB9KVxuICB9XG5cbiAgbGV0IHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2UgLy8gdXNlZCBieSBpbml0U2Nyb2xsSGFuZGxlclxuICBsZXQgc2Nyb2xsSGFuZGxlciA9IG51bGxcbiAgZnVuY3Rpb24gaW5pdFNjcm9sbEhhbmRsZXIoKSB7XG4gICAgaWYgKCFzY3JvbGxIYW5kbGVyKSB7XG4gICAgICBzY3JvbGxIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgICAgfVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpXG4gICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHdpbmRvd0lzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgICAgICAgIGZvckVhY2goZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXIqPSdyZXZlYWxlZCddLFtkYXRhLWh4LXRyaWdnZXIqPSdyZXZlYWxlZCddXCIpLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIG1heWJlUmV2ZWFsKGVsdClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVJldmVhbChlbHQpIHtcbiAgICBpZiAoIWhhc0F0dHJpYnV0ZShlbHQsICdkYXRhLWh4LXJldmVhbGVkJykgJiYgaXNTY3JvbGxlZEludG9WaWV3KGVsdCkpIHtcbiAgICAgIGVsdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaHgtcmV2ZWFsZWQnLCAndHJ1ZScpXG4gICAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAobm9kZURhdGEuaW5pdEhhc2gpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZSBub2RlIGlzbid0IGluaXRpYWxpemVkLCB3YWl0IGZvciBpdCBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgcmVxdWVzdFxuICAgICAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphZnRlclByb2Nlc3NOb2RlJywgZnVuY3Rpb24oKSB7IHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpIH0sIHsgb25jZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5XG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSW1tZWRpYXRlbHkoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgZGVsYXkpIHtcbiAgICBjb25zdCBsb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW5vZGVEYXRhLmxvYWRlZCkge1xuICAgICAgICBub2RlRGF0YS5sb2FkZWQgPSB0cnVlXG4gICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGxvYWQsIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGxldCBleHBsaWNpdEFjdGlvbiA9IGZhbHNlXG4gICAgZm9yRWFjaChWRVJCUywgZnVuY3Rpb24odmVyYikge1xuICAgICAgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC0nICsgdmVyYikpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LScgKyB2ZXJiKVxuICAgICAgICBleHBsaWNpdEFjdGlvbiA9IHRydWVcbiAgICAgICAgbm9kZURhdGEucGF0aCA9IHBhdGhcbiAgICAgICAgbm9kZURhdGEudmVyYiA9IHZlcmJcbiAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGV4cGxpY2l0QWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQGNhbGxiYWNrIFRyaWdnZXJIYW5kbGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IFtldnRdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKi9cbiAgZnVuY3Rpb24gYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGhhbmRsZXIpIHtcbiAgICBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ3JldmVhbGVkJykge1xuICAgICAgaW5pdFNjcm9sbEhhbmRsZXIoKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICAgIG1heWJlUmV2ZWFsKGFzRWxlbWVudChlbHQpKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2ludGVyc2VjdCcpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyT3B0aW9ucyA9IHt9XG4gICAgICBpZiAodHJpZ2dlclNwZWMucm9vdCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMucm9vdCA9IHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0cmlnZ2VyU3BlYy5yb290KVxuICAgICAgfVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocmVzaG9sZCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMudGhyZXNob2xkID0gcGFyc2VGbG9hdCh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpXG4gICAgICB9XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlbnRyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXVxuICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2ludGVyc2VjdCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgb2JzZXJ2ZXJPcHRpb25zKVxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShhc0VsZW1lbnQoZWx0KSlcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdsb2FkJykge1xuICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIG1ha2VFdmVudCgnbG9hZCcsIHsgZWx0IH0pKSkge1xuICAgICAgICBsb2FkSW1tZWRpYXRlbHkoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnBvbGxJbnRlcnZhbCA+IDApIHtcbiAgICAgIG5vZGVEYXRhLnBvbGxpbmcgPSB0cnVlXG4gICAgICBwcm9jZXNzUG9sbGluZyhhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3NIeE9uKG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbHQuYXR0cmlidXRlc1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdLm5hbWVcbiAgICAgIGlmIChzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb246JykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb246JykgfHxcbiAgICAgICAgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uLScpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uLScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBjb25zdCBIWF9PTl9RVUVSWSA9IG5ldyBYUGF0aEV2YWx1YXRvcigpXG4gICAgLmNyZWF0ZUV4cHJlc3Npb24oJy4vLypbQCpbIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbjpcIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb246XCIpIG9yJyArXG4gICAgICAnIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbi1cIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb24tXCIpIF1dJylcblxuICBmdW5jdGlvbiBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cykge1xuICAgIGlmIChzaG91bGRQcm9jZXNzSHhPbihlbHQpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChlbHQpKVxuICAgIH1cbiAgICBjb25zdCBpdGVyID0gSFhfT05fUVVFUlkuZXZhbHVhdGUoZWx0KVxuICAgIGxldCBub2RlID0gbnVsbFxuICAgIHdoaWxlIChub2RlID0gaXRlci5pdGVyYXRlTmV4dCgpKSBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChub2RlKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpIHtcbiAgICAvKiogQHR5cGUge0VsZW1lbnRbXX0gKi9cbiAgICBjb25zdCBlbGVtZW50cyA9IFtdXG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWx0LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgcHJvY2Vzc0hYT25Sb290KGNoaWxkLCBlbGVtZW50cylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpXG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCkge1xuICAgIGlmIChlbHQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgY29uc3QgYm9vc3RlZFNlbGVjdG9yID0gJywgW2h4LWJvb3N0XSBhLCBbZGF0YS1oeC1ib29zdF0gYSwgYVtoeC1ib29zdF0sIGFbZGF0YS1oeC1ib29zdF0nXG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvblNlbGVjdG9ycyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGUgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2VdXG4gICAgICAgIGlmIChleHRlbnNpb24uZ2V0U2VsZWN0b3JzKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMoKVxuICAgICAgICAgIGlmIChzZWxlY3RvcnMpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvblNlbGVjdG9ycy5wdXNoKHNlbGVjdG9ycylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGVsdC5xdWVyeVNlbGVjdG9yQWxsKFZFUkJfU0VMRUNUT1IgKyBib29zdGVkU2VsZWN0b3IgKyBcIiwgZm9ybSwgW3R5cGU9J3N1Ym1pdCddLFwiICtcbiAgICAgICAgJyBbaHgtZXh0XSwgW2RhdGEtaHgtZXh0XSwgW2h4LXRyaWdnZXJdLCBbZGF0YS1oeC10cmlnZ2VyXScgKyBleHRlbnNpb25TZWxlY3RvcnMuZmxhdCgpLm1hcChzID0+ICcsICcgKyBzKS5qb2luKCcnKSlcblxuICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICogc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gKi8gKGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIikpXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBlbHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIilcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGZvcm0gPSByZXNvbHZlVGFyZ2V0KCcjJyArIGdldFJhd0F0dHJpYnV0ZShlbHQsICdmb3JtJyksIGVsdC5nZXRSb290Tm9kZSgpKSB8fCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKVxuICAgIGlmICghZm9ybSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXRCdXR0b25UcmFja2luZyhlbHQpIHtcbiAgICAvLyBuZWVkIHRvIGhhbmRsZSBib3RoIGNsaWNrIGFuZCBmb2N1cyBpbjpcbiAgICAvLyAgIGZvY3VzaW4gLSBpbiBjYXNlIHNvbWVvbmUgdGFicyBpbiB0byBhIGJ1dHRvbiBhbmQgaGl0cyB0aGUgc3BhY2UgYmFyXG4gICAgLy8gICBjbGljayAtIG9uIE9TWCBidXR0b25zIGRvIG5vdCBmb2N1cyBvbiBjbGljayBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzI0XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGVcbiAgICovXG4gIGZ1bmN0aW9uIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIGNvZGUpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGVEYXRhLm9uSGFuZGxlcnMpKSB7XG4gICAgICBub2RlRGF0YS5vbkhhbmRsZXJzID0gW11cbiAgICB9XG4gICAgbGV0IGZ1bmNcbiAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICBmdW5jID0gbmV3IEZ1bmN0aW9uKCdldmVudCcsIGNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgZnVuYy5jYWxsKGVsdCwgZSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgbm9kZURhdGEub25IYW5kbGVycy5wdXNoKHsgZXZlbnQ6IGV2ZW50TmFtZSwgbGlzdGVuZXIgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0h4T25XaWxkY2FyZChlbHQpIHtcbiAgICAvLyB3aXBlIGFueSBwcmV2aW91cyBvbiBoYW5kbGVycyBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMgcHJlY2VkZW5jZVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWx0KVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGNvbnN0IHZhbHVlID0gZWx0LmF0dHJpYnV0ZXNbaV0udmFsdWVcbiAgICAgIGlmIChzdGFydHNXaXRoKG5hbWUsICdoeC1vbicpIHx8IHN0YXJ0c1dpdGgobmFtZSwgJ2RhdGEtaHgtb24nKSkge1xuICAgICAgICBjb25zdCBhZnRlck9uUG9zaXRpb24gPSBuYW1lLmluZGV4T2YoJy1vbicpICsgM1xuICAgICAgICBjb25zdCBuZXh0Q2hhciA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uLCBhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICBpZiAobmV4dENoYXIgPT09ICctJyB8fCBuZXh0Q2hhciA9PT0gJzonKSB7XG4gICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgICAvLyBpZiB0aGUgZXZlbnROYW1lIHN0YXJ0cyB3aXRoIGEgY29sb24gb3IgZGFzaCwgcHJlcGVuZCBcImh0bXhcIiBmb3Igc2hvcnRoYW5kIHN1cHBvcnRcbiAgICAgICAgICBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICc6JykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14JyArIGV2ZW50TmFtZVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICctJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoMSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnaHRteC0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSg1KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXROb2RlKGVsdCkge1xuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAobm9kZURhdGEuaW5pdEhhc2ggIT09IGF0dHJpYnV0ZUhhc2goZWx0KSkge1xuICAgICAgLy8gY2xlYW4gdXAgYW55IHByZXZpb3VzbHkgcHJvY2Vzc2VkIGluZm9cbiAgICAgIGRlSW5pdE5vZGUoZWx0KVxuXG4gICAgICBub2RlRGF0YS5pbml0SGFzaCA9IGF0dHJpYnV0ZUhhc2goZWx0KVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpXG5cbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgaWYgKGVsdC52YWx1ZSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG5vZGVEYXRhLmxhc3RWYWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBnZXRUcmlnZ2VyU3BlY3MoZWx0KVxuICAgICAgY29uc3QgaGFzRXhwbGljaXRIdHRwQWN0aW9uID0gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcblxuICAgICAgaWYgKCFoYXNFeHBsaWNpdEh0dHBBY3Rpb24pIHtcbiAgICAgICAgaWYgKGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1ib29zdCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuICAgICAgICB9IGVsc2UgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC10cmlnZ2VyJykpIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgICAgLy8gRm9yIFwibmFrZWRcIiB0cmlnZ2VycywgZG9uJ3QgZG8gYW55dGhpbmcgYXQgYWxsXG4gICAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nIHx8IChnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JyAmJiBoYXNBdHRyaWJ1dGUoZWx0LCAnZm9ybScpKSkge1xuICAgICAgICBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclByb2Nlc3NOb2RlJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIG5ldyBjb250ZW50LCBlbmFibGluZyBodG14IGJlaGF2aW9yLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgY29udGVudCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBET00gb3V0c2lkZSBvZiB0aGUgbm9ybWFsIGh0bXggcmVxdWVzdCBjeWNsZSBidXQgc3RpbGwgd2FudCBodG14IGF0dHJpYnV0ZXMgdG8gd29yay5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcHJvY2Vzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgZWxlbWVudCB0byBwcm9jZXNzXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShlbHQpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpbml0Tm9kZShlbHQpXG4gICAgZm9yRWFjaChmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSwgZnVuY3Rpb24oY2hpbGQpIHsgaW5pdE5vZGUoY2hpbGQpIH0pXG4gICAgZm9yRWFjaChmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSwgcHJvY2Vzc0h4T25XaWxkY2FyZClcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV2ZW50L0xvZyBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRldGFpbFxuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgLy8gVGhpcyBicmVha3MgZXhwZWN0ZWQgZW5jYXBzdWxhdGlvbiBidXQgbmVlZHMgdG8gYmUgaGVyZSB1bnRpbCBkZWNpZGVkIG90aGVyd2lzZSBieSBjb3JlIGRldnNcbiAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBldnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsXG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXJyb3JFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZXZlbnROYW1lIH0sIGRldGFpbCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpIHtcbiAgICByZXR1cm4gZXZlbnROYW1lID09PSAnaHRteDphZnRlclByb2Nlc3NOb2RlJ1xuICB9XG5cbiAgLyoqXG4gICAqIGB3aXRoRXh0ZW5zaW9uc2AgbG9jYXRlcyBhbGwgYWN0aXZlIGV4dGVuc2lvbnMgZm9yIGEgcHJvdmlkZWQgZWxlbWVudCwgdGhlblxuICAgKiBleGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdXNpbmcgZWFjaCBvZiB0aGUgYWN0aXZlIGV4dGVuc2lvbnMuICBJdCBzaG91bGRcbiAgICogYmUgY2FsbGVkIGludGVybmFsbHkgYXQgZXZlcnkgZXh0ZW5kYWJsZSBleGVjdXRpb24gcG9pbnQgaW4gaHRteC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHsoZXh0ZW5zaW9uOkh0bXhFeHRlbnNpb24pID0+IHZvaWR9IHRvRG9cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aEV4dGVuc2lvbnMoZWx0LCB0b0RvKSB7XG4gICAgZm9yRWFjaChnZXRFeHRlbnNpb25zKGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9EbyhleHRlbnNpb24pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ0Vycm9yKG1zZykge1xuICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1zZylcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICBjb25zb2xlLmxvZygnRVJST1I6ICcsIG1zZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBnaXZlbiBldmVudCBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RyaWdnZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byB0cmlnZ2VyXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsIGRldGFpbHMgZm9yIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRldGFpbCA9PSBudWxsKSB7XG4gICAgICBkZXRhaWwgPSB7fVxuICAgIH1cbiAgICBkZXRhaWwuZWx0ID0gZWx0XG4gICAgY29uc3QgZXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgaWYgKGh0bXgubG9nZ2VyICYmICFpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSkge1xuICAgICAgaHRteC5sb2dnZXIoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICB9XG4gICAgaWYgKGRldGFpbC5lcnJvcikge1xuICAgICAgbG9nRXJyb3IoZGV0YWlsLmVycm9yKVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6ZXJyb3InLCB7IGVycm9ySW5mbzogZGV0YWlsIH0pXG4gICAgfVxuICAgIGxldCBldmVudFJlc3VsdCA9IGVsdC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGtlYmFiTmFtZSA9IGtlYmFiRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAgICBpZiAoZXZlbnRSZXN1bHQgJiYga2ViYWJOYW1lICE9PSBldmVudE5hbWUpIHtcbiAgICAgIGNvbnN0IGtlYmFiZWRFdmVudCA9IG1ha2VFdmVudChrZWJhYk5hbWUsIGV2ZW50LmRldGFpbClcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgZWx0LmRpc3BhdGNoRXZlbnQoa2ViYWJlZEV2ZW50KVxuICAgIH1cbiAgICB3aXRoRXh0ZW5zaW9ucyhhc0VsZW1lbnQoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIChleHRlbnNpb24ub25FdmVudChldmVudE5hbWUsIGV2ZW50KSAhPT0gZmFsc2UgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgfSlcbiAgICByZXR1cm4gZXZlbnRSZXN1bHRcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhpc3RvcnkgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsZXQgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAvKipcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRIaXN0b3J5RWxlbWVudCgpIHtcbiAgICBjb25zdCBoaXN0b3J5RWx0ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpXG4gICAgcmV0dXJuIGhpc3RvcnlFbHQgfHwgZ2V0RG9jdW1lbnQoKS5ib2R5XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbHRcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVUb0hpc3RvcnlDYWNoZSh1cmwsIHJvb3RFbHQpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgc3RhdGUgdG8gc2F2ZVxuICAgIGNvbnN0IGlubmVySFRNTCA9IGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShyb290RWx0KVxuICAgIGNvbnN0IHRpdGxlID0gZ2V0RG9jdW1lbnQoKS50aXRsZVxuICAgIGNvbnN0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSA8PSAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbiBldmVudHVhbGx5IGFscmVhZHkgZXhpc3RpbmcgY2FjaGUgaXMgcHVyZ2VkXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICBoaXN0b3J5Q2FjaGUuc3BsaWNlKGksIDEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIEh0bXhIaXN0b3J5SXRlbSAqL1xuICAgIGNvbnN0IG5ld0hpc3RvcnlJdGVtID0geyB1cmwsIGNvbnRlbnQ6IGlubmVySFRNTCwgdGl0bGUsIHNjcm9sbCB9XG5cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5SXRlbUNyZWF0ZWQnLCB7IGl0ZW06IG5ld0hpc3RvcnlJdGVtLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG5cbiAgICBoaXN0b3J5Q2FjaGUucHVzaChuZXdIaXN0b3J5SXRlbSlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUpIHtcbiAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpXG4gICAgfVxuXG4gICAgLy8ga2VlcCB0cnlpbmcgdG8gc2F2ZSB0aGUgY2FjaGUgdW50aWwgaXQgc3VjY2VlZHMgb3IgaXMgZW1wdHlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5Q2FjaGUpKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZUVycm9yJywgeyBjYXVzZTogZSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuICAgICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKSAvLyBzaHJpbmsgdGhlIGNhY2hlIGFuZCByZXRyeVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeUl0ZW1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNjcm9sbFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcmV0dXJucyB7SHRteEhpc3RvcnlJdGVtfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDYWNoZWRIaXN0b3J5KHVybCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIHJldHVybiBoaXN0b3J5Q2FjaGVbaV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KGVsdCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGh0bXguY29uZmlnLnJlcXVlc3RDbGFzc1xuICAgIGNvbnN0IGNsb25lID0gLyoqIEB0eXBlIEVsZW1lbnQgKi8gKGVsdC5jbG9uZU5vZGUodHJ1ZSkpXG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnLicgKyBjbGFzc05hbWUpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhc3NOYW1lKVxuICAgIH0pXG4gICAgLy8gcmVtb3ZlIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgZm9yIGFueSBlbGVtZW50IGRpc2FibGVkIGR1ZSB0byBhbiBodG14IHJlcXVlc3RcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICdbZGF0YS1kaXNhYmxlZC1ieS1odG14XScpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgfSlcbiAgICByZXR1cm4gY2xvbmUuaW5uZXJIVE1MXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKSB7XG4gICAgY29uc3QgZWx0ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50UGF0aEZvckhpc3RvcnkgfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAgIC8vIEFsbG93IGhpc3Rvcnkgc25hcHNob3QgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCB3aGVyZSBoeC1oaXN0b3J5PVwiZmFsc2VcIlxuICAgIC8vIGlzIHByZXNlbnQgKmFueXdoZXJlKiBpbiB0aGUgY3VycmVudCBkb2N1bWVudCB3ZSdyZSBhYm91dCB0byBzYXZlLFxuICAgIC8vIHNvIHdlIGNhbiBwcmV2ZW50IHByaXZpbGVnZWQgZGF0YSBlbnRlcmluZyB0aGUgY2FjaGUuXG4gICAgLy8gVGhlIHBhZ2Ugd2lsbCBzdGlsbCBiZSByZWFjaGFibGUgYXMgYSBoaXN0b3J5IGVudHJ5LCBidXQgaHRteCB3aWxsIGZldGNoIGl0XG4gICAgLy8gbGl2ZSBmcm9tIHRoZSBzZXJ2ZXIgb25wb3BzdGF0ZSByYXRoZXIgdGhhbiBsb29rIGluIHRoZSBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICBsZXQgZGlzYWJsZUhpc3RvcnlDYWNoZVxuICAgIHRyeSB7XG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0nKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJRTExOiBpbnNlbnNpdGl2ZSBtb2RpZmllciBub3Qgc3VwcG9ydGVkIHNvIGZhbGxiYWNrIHRvIGNhc2Ugc2Vuc2l0aXZlIHNlbGVjdG9yXG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCJdLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiXScpXG4gICAgfVxuICAgIGlmICghZGlzYWJsZUhpc3RvcnlDYWNoZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVNhdmUnLCB7IHBhdGgsIGhpc3RvcnlFbHQ6IGVsdCB9KVxuICAgICAgc2F2ZVRvSGlzdG9yeUNhY2hlKHBhdGgsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCBnZXREb2N1bWVudCgpLnRpdGxlLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcHVzaFVybEludG9IaXN0b3J5KHBhdGgpIHtcbiAgLy8gcmVtb3ZlIHRoZSBjYWNoZSBidXN0ZXIgcGFyYW1ldGVyLCBpZiBhbnlcbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvb3JnXFwuaHRteFxcLmNhY2hlLWJ1c3Rlcj1bXiZdKiY/LywgJycpXG4gICAgICBpZiAoZW5kc1dpdGgocGF0aCwgJyYnKSB8fCBlbmRzV2l0aChwYXRoLCAnPycpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIHtcbiAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICB9XG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlVXJsSW5IaXN0b3J5KHBhdGgpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0dGxlSW1tZWRpYXRlbHkodGFza3MpIHtcbiAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICB0YXNrLmNhbGwodW5kZWZpbmVkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgY29uc3QgZGV0YWlscyA9IHsgcGF0aCwgeGhyOiByZXF1ZXN0IH1cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzJywgZGV0YWlscylcbiAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1DdXJyZW50LVVSTCcsIGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZilcbiAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZCcsIGRldGFpbHMpXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KHRoaXMucmVzcG9uc2UpXG4gICAgICAgIC8qKiBAdHlwZSBQYXJlbnROb2RlICovXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpIHx8IGZyYWdtZW50XG4gICAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuXG4gICAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGNvbnRlbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGNhY2hlTWlzczogdHJ1ZSwgc2VydmVyUmVzcG9uc2U6IHRoaXMucmVzcG9uc2UgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWRFcnJvcicsIGRldGFpbHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3Quc2VuZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzdG9yZUhpc3RvcnkocGF0aCkge1xuICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgcGF0aCA9IHBhdGggfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRIaXN0b3J5KHBhdGgpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY2FjaGVkLmNvbnRlbnQpXG4gICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGNhY2hlZC5zY3JvbGwpXG4gICAgICB9LCAwKSAvLyBuZXh0ICd0aWNrJywgc28gYnJvd3NlciBoYXMgdGltZSB0byByZW5kZXIgbGF5b3V0XG4gICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgaXRlbTogY2FjaGVkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5yZWZyZXNoT25IaXN0b3J5TWlzcykge1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gcmVsb2FkKCkgZnVuY3Rpb24gdGhyb3dzIGVycm9yXG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpIHtcbiAgICBsZXQgaW5kaWNhdG9ycyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluZGljYXRvcicpKVxuICAgIGlmIChpbmRpY2F0b3JzID09IG51bGwpIHtcbiAgICAgIGluZGljYXRvcnMgPSBbZWx0XVxuICAgIH1cbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBpYy5jbGFzc0xpc3QuYWRkLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgfSlcbiAgICByZXR1cm4gaW5kaWNhdG9yc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBkaXNhYmxlRWxlbWVudHMoZWx0KSB7XG4gICAgbGV0IGRpc2FibGVkRWx0cyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWRpc2FibGVkLWVsdCcpKVxuICAgIGlmIChkaXNhYmxlZEVsdHMgPT0gbnVsbCkge1xuICAgICAgZGlzYWJsZWRFbHRzID0gW11cbiAgICB9XG4gICAgZm9yRWFjaChkaXNhYmxlZEVsdHMsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnLCAnJylcbiAgICB9KVxuICAgIHJldHVybiBkaXNhYmxlZEVsdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gaW5kaWNhdG9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVkKSB7XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgaWMuY2xhc3NMaXN0LnJlbW92ZS5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChkaXNhYmxlZCwgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnB1dCBWYWx1ZSBQcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IHByb2Nlc3NlZFtpXVxuICAgICAgaWYgKG5vZGUuaXNTYW1lTm9kZShlbHQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkSW5jbHVkZShlbGVtZW50KSB7XG4gICAgLy8gQ2FzdCB0byB0cmljayB0c2MsIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCB3b3JrIGZpbmUgaGVyZVxuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudH0gKi8gKGVsZW1lbnQpXG4gICAgaWYgKGVsdC5uYW1lID09PSAnJyB8fCBlbHQubmFtZSA9PSBudWxsIHx8IGVsdC5kaXNhYmxlZCB8fCBjbG9zZXN0KGVsdCwgJ2ZpZWxkc2V0W2Rpc2FibGVkXScpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgLy8gaWdub3JlIFwic3VibWl0dGVyXCIgdHlwZXMgKHNlZSBqUXVlcnkgc3JjL3NlcmlhbGl6ZS5qcylcbiAgICBpZiAoZWx0LnR5cGUgPT09ICdidXR0b24nIHx8IGVsdC50eXBlID09PSAnc3VibWl0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ltYWdlJyB8fCBlbHQudGFnTmFtZSA9PT0gJ3Jlc2V0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGVsdC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsdC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm4gZWx0LmNoZWNrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheXxGb3JtRGF0YUVudHJ5VmFsdWV9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxldCB2YWx1ZXMgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdmFsdWUuaW5kZXhPZih2KSA8IDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpXG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgIGZvckVhY2godmFsdWVzLCB2ID0+IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudHxIVE1MU2VsZWN0RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpIHtcbiAgICBpZiAoZWx0ID09IG51bGwgfHwgaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NlZC5wdXNoKGVsdClcbiAgICB9XG4gICAgaWYgKHNob3VsZEluY2x1ZGUoZWx0KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJylcbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgbGV0IHZhbHVlID0gZWx0LnZhbHVlXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgZWx0Lm11bHRpcGxlKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uOmNoZWNrZWQnKSkubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuICgvKiogQHR5cGUgSFRNTE9wdGlvbkVsZW1lbnQgKi8oZSkpLnZhbHVlIH0pXG4gICAgICB9XG4gICAgICAvLyBpbmNsdWRlIGZpbGUgaW5wdXRzXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbHQuZmlsZXMpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5maWxlcylcbiAgICAgIH1cbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGVsdC5lbGVtZW50cywgZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHByb2Nlc3NlZC5pbmRleE9mKGlucHV0KSA+PSAwKSB7XG4gICAgICAgICAgLy8gVGhlIGlucHV0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZCBhZGRlZCB0byB0aGUgdmFsdWVzLCBidXQgdGhlIEZvcm1EYXRhIHRoYXQgd2lsbCBiZVxuICAgICAgICAgIC8vICBjb25zdHJ1Y3RlZCByaWdodCBhZnRlciBvbiB0aGUgZm9ybSwgd2lsbCBpbmNsdWRlIGl0IG9uY2UgYWdhaW4uIFNvIHJlbW92ZSB0aGF0IGlucHV0J3MgdmFsdWVcbiAgICAgICAgICAvLyAgbm93IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShpbnB1dC5uYW1lLCBpbnB1dC52YWx1ZSwgZm9ybURhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1c2goaW5wdXQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgICAgdmFsaWRhdGVFbGVtZW50KGlucHV0LCBlcnJvcnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBuZXcgRm9ybURhdGEoZWx0KS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgJiYgdmFsdWUubmFtZSA9PT0gJycpIHtcbiAgICAgICAgICByZXR1cm4gLy8gaWdub3JlIG5vLW5hbWUgZmlsZXNcbiAgICAgICAgfVxuICAgICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICovXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50ICYgRWxlbWVudEludGVybmFsc30gKi8gKGVsdClcbiAgICBpZiAoZWxlbWVudC53aWxsVmFsaWRhdGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOnZhbGlkYXRlJylcbiAgICAgIGlmICghZWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBlbHQ6IGVsZW1lbnQsIG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOmZhaWxlZCcsIHsgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBvbmUgRm9ybURhdGEgd2l0aCB0aG9zZSBmcm9tIGFub3RoZXIuXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IHJlY2VpdmVyIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBkb25vciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIG92ZXJyaWRpbmcgdmFsdWVzXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX0gdGhlIHtAbGlua2NvZGUgcmVjZWl2ZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvdmVycmlkZUZvcm1EYXRhKHJlY2VpdmVyLCBkb25vcikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGRvbm9yLmtleXMoKSkge1xuICAgICAgcmVjZWl2ZXIuZGVsZXRlKGtleSlcbiAgICB9XG4gICAgZG9ub3IuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZWNlaXZlci5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZWNlaXZlclxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEByZXR1cm5zIHt7ZXJyb3JzOiBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdLCBmb3JtRGF0YTogRm9ybURhdGEsIHZhbHVlczogT2JqZWN0fX1cbiAqL1xuICBmdW5jdGlvbiBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpIHtcbiAgICAvKiogQHR5cGUgRWxlbWVudFtdICovXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gW11cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgY29uc3QgcHJpb3JpdHlGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgLyoqIEB0eXBlIEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCAmJiAhYm9keUNvbnRhaW5zKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBvbmx5IHZhbGlkYXRlIHdoZW4gZm9ybSBpcyBkaXJlY3RseSBzdWJtaXR0ZWQgYW5kIG5vdmFsaWRhdGUgb3IgZm9ybW5vdmFsaWRhdGUgYXJlIG5vdCBzZXRcbiAgICAvLyBvciBpZiB0aGUgZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgaHgtdmFsaWRhdGU9XCJ0cnVlXCIgb24gaXRcbiAgICBsZXQgdmFsaWRhdGUgPSAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmIGVsdC5ub1ZhbGlkYXRlICE9PSB0cnVlKSB8fCBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC12YWxpZGF0ZScpID09PSAndHJ1ZSdcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSB7XG4gICAgICB2YWxpZGF0ZSA9IHZhbGlkYXRlICYmIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZC5mb3JtTm9WYWxpZGF0ZSAhPT0gdHJ1ZVxuICAgIH1cblxuICAgIC8vIGZvciBhIG5vbi1HRVQgaW5jbHVkZSB0aGUgY2xvc2VzdCBmb3JtXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIHByaW9yaXR5Rm9ybURhdGEsIGVycm9ycywgY2xvc2VzdChlbHQsICdmb3JtJyksIHZhbGlkYXRlKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKVxuXG4gICAgLy8gaWYgYSBidXR0b24gb3Igc3VibWl0IHdhcyBjbGlja2VkIGxhc3QsIGluY2x1ZGUgaXRzIHZhbHVlXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCBlbHQudGFnTmFtZSA9PT0gJ0JVVFRPTicgfHxcbiAgICAoZWx0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcpKSB7XG4gICAgICBjb25zdCBidXR0b24gPSBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgKC8qKiBAdHlwZSBIVE1MSW5wdXRFbGVtZW50fEhUTUxCdXR0b25FbGVtZW50ICovKGVsdCkpXG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGJ1dHRvbiwgJ25hbWUnKVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIGJ1dHRvbi52YWx1ZSwgcHJpb3JpdHlGb3JtRGF0YSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIGFueSBleHBsaWNpdCBpbmNsdWRlc1xuICAgIGNvbnN0IGluY2x1ZGVzID0gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5jbHVkZScpXG4gICAgZm9yRWFjaChpbmNsdWRlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBhc0VsZW1lbnQobm9kZSksIHZhbGlkYXRlKVxuICAgICAgLy8gaWYgYSBub24tZm9ybSBpcyBpbmNsdWRlZCwgaW5jbHVkZSBhbnkgaW5wdXQgdmFsdWVzIHdpdGhpbiBpdFxuICAgICAgaWYgKCFtYXRjaGVzKG5vZGUsICdmb3JtJykpIHtcbiAgICAgICAgZm9yRWFjaChhc1BhcmVudE5vZGUobm9kZSkucXVlcnlTZWxlY3RvckFsbChJTlBVVF9TRUxFQ1RPUiksIGZ1bmN0aW9uKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGRlc2NlbmRhbnQsIHZhbGlkYXRlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyB2YWx1ZXMgZnJvbSBhIDxmb3JtPiB0YWtlIHByZWNlZGVuY2UsIG92ZXJyaWRpbmcgdGhlIHJlZ3VsYXIgdmFsdWVzXG4gICAgb3ZlcnJpZGVGb3JtRGF0YShmb3JtRGF0YSwgcHJpb3JpdHlGb3JtRGF0YSlcblxuICAgIHJldHVybiB7IGVycm9ycywgZm9ybURhdGEsIHZhbHVlczogZm9ybURhdGFQcm94eShmb3JtRGF0YSkgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXR1cm5TdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHthbnl9IHJlYWxWYWx1ZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBuYW1lLCByZWFsVmFsdWUpIHtcbiAgICBpZiAocmV0dXJuU3RyICE9PSAnJykge1xuICAgICAgcmV0dXJuU3RyICs9ICcmJ1xuICAgIH1cbiAgICBpZiAoU3RyaW5nKHJlYWxWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZWFsVmFsdWUgPSBKU09OLnN0cmluZ2lmeShyZWFsVmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IHMgPSBlbmNvZGVVUklDb21wb25lbnQocmVhbFZhbHVlKVxuICAgIHJldHVyblN0ciArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBzXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF8T2JqZWN0fSB2YWx1ZXNcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBmdW5jdGlvbiB1cmxFbmNvZGUodmFsdWVzKSB7XG4gICAgdmFsdWVzID0gZm9ybURhdGFGcm9tT2JqZWN0KHZhbHVlcylcbiAgICBsZXQgcmV0dXJuU3RyID0gJydcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm5TdHIgPSBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBamF4XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9tcHRcbiAqIEByZXR1cm5zIHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHQpIHtcbiAgICAvKiogQHR5cGUgSHRteEhlYWRlclNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgJ0hYLVJlcXVlc3QnOiAndHJ1ZScsXG4gICAgICAnSFgtVHJpZ2dlcic6IGdldFJhd0F0dHJpYnV0ZShlbHQsICdpZCcpLFxuICAgICAgJ0hYLVRyaWdnZXItTmFtZSc6IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJyksXG4gICAgICAnSFgtVGFyZ2V0JzogZ2V0QXR0cmlidXRlVmFsdWUodGFyZ2V0LCAnaWQnKSxcbiAgICAgICdIWC1DdXJyZW50LVVSTCc6IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cbiAgICBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LWhlYWRlcnMnLCBmYWxzZSwgaGVhZGVycylcbiAgICBpZiAocHJvbXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLVByb21wdCddID0gcHJvbXB0XG4gICAgfVxuICAgIGlmIChnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Cb29zdGVkJ10gPSAndHJ1ZSdcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIC8qKlxuICogZmlsdGVyVmFsdWVzIHRha2VzIGFuIG9iamVjdCBjb250YWluaW5nIGZvcm0gaW5wdXQgdmFsdWVzXG4gKiBhbmQgcmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBvbmx5IGNvbnRhaW5zIGtleXMgdGhhdCBhcmVcbiAqIHNwZWNpZmllZCBieSB0aGUgY2xvc2VzdCBcImh4LXBhcmFtc1wiIGF0dHJpYnV0ZVxuICogQHBhcmFtIHtGb3JtRGF0YX0gaW5wdXRWYWx1ZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZmlsdGVyVmFsdWVzKGlucHV0VmFsdWVzLCBlbHQpIHtcbiAgICBjb25zdCBwYXJhbXNWYWx1ZSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wYXJhbXMnKVxuICAgIGlmIChwYXJhbXNWYWx1ZSkge1xuICAgICAgaWYgKHBhcmFtc1ZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlLmluZGV4T2YoJ25vdCAnKSA9PT0gMCkge1xuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnN1YnN0cig0KS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaW5wdXRWYWx1ZXMuZGVsZXRlKG5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaWYgKGlucHV0VmFsdWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZXMuZ2V0QWxsKG5hbWUpLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHsgbmV3VmFsdWVzLmFwcGVuZChuYW1lLCB2YWx1ZSkgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBuZXdWYWx1ZXNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0FuY2hvckxpbmsoZWx0KSB7XG4gICAgcmV0dXJuICEhZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSA+PSAwXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IFtzd2FwSW5mb092ZXJyaWRlXVxuICogQHJldHVybnMge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBJbmZvT3ZlcnJpZGUpIHtcbiAgICBjb25zdCBzd2FwSW5mbyA9IHN3YXBJbmZvT3ZlcnJpZGUgfHwgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN3YXAnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBzd2FwU3BlYyA9IHtcbiAgICAgIHN3YXBTdHlsZTogZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCA/ICdpbm5lckhUTUwnIDogaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSxcbiAgICAgIHN3YXBEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFN3YXBEZWxheSxcbiAgICAgIHNldHRsZURlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U2V0dGxlRGVsYXlcbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLnNjcm9sbEludG9WaWV3T25Cb29zdCAmJiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmICFpc0FuY2hvckxpbmsoZWx0KSkge1xuICAgICAgc3dhcFNwZWMuc2hvdyA9ICd0b3AnXG4gICAgfVxuICAgIGlmIChzd2FwSW5mbykge1xuICAgICAgY29uc3Qgc3BsaXQgPSBzcGxpdE9uV2hpdGVzcGFjZShzd2FwSW5mbylcbiAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNwbGl0W2ldXG4gICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ3N3YXA6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDUpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2V0dGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zZXR0bGVEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDcpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZigndHJhbnNpdGlvbjonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMudHJhbnNpdGlvbiA9IHZhbHVlLnN1YnN0cigxMSkgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignaWdub3JlVGl0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gdmFsdWUuc3Vic3RyKDEyKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFNwZWMgPSB2YWx1ZS5zdWJzdHIoNylcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzY3JvbGxTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsID0gc2Nyb2xsVmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGxUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2hvdzonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2hvd1NwZWMgPSB2YWx1ZS5zdWJzdHIoNSlcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzaG93U3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzaG93VmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93ID0gc2hvd1ZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvd1RhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdmb2N1cy1zY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzU2Nyb2xsVmFsID0gdmFsdWUuc3Vic3RyKCdmb2N1cy1zY3JvbGw6Jy5sZW5ndGgpXG4gICAgICAgICAgICBzd2FwU3BlYy5mb2N1c1Njcm9sbCA9IGZvY3VzU2Nyb2xsVmFsID09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwU3R5bGUgPSB2YWx1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dFcnJvcignVW5rbm93biBtb2RpZmllciBpbiBoeC1zd2FwOiAnICsgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3BlY1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB1c2VzRm9ybURhdGEoZWx0KSB7XG4gICAgcmV0dXJuIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1lbmNvZGluZycpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfHxcbiAgICAobWF0Y2hlcyhlbHQsICdmb3JtJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2VuY3R5cGUnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmaWx0ZXJlZFBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgeyp8c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZFBhcmFtZXRlcnMpIHtcbiAgICBsZXQgZW5jb2RlZFBhcmFtZXRlcnMgPSBudWxsXG4gICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyA9PSBudWxsKSB7XG4gICAgICAgIGVuY29kZWRQYXJhbWV0ZXJzID0gZXh0ZW5zaW9uLmVuY29kZVBhcmFtZXRlcnMoeGhyLCBmaWx0ZXJlZFBhcmFtZXRlcnMsIGVsdClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5jb2RlZFBhcmFtZXRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbnZlcnNpb24gdG8gYW4gYWN0dWFsIEZvcm1EYXRhIG9iamVjdCBpbiBjYXNlIGZpbHRlcmVkUGFyYW1ldGVycyBpcyBhIGZvcm1EYXRhUHJveHlcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14L2lzc3Vlcy8yMzE3XG4gICAgICAgIHJldHVybiBvdmVycmlkZUZvcm1EYXRhKG5ldyBGb3JtRGF0YSgpLCBmb3JtRGF0YUZyb21PYmplY3QoZmlsdGVyZWRQYXJhbWV0ZXJzKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmxFbmNvZGUoZmlsdGVyZWRQYXJhbWV0ZXJzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7SHRteFNldHRsZUluZm99XG4gKi9cbiAgZnVuY3Rpb24gbWFrZVNldHRsZUluZm8odGFyZ2V0KSB7XG4gICAgcmV0dXJuIHsgdGFza3M6IFtdLCBlbHRzOiBbdGFyZ2V0XSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxTdGF0ZShjb250ZW50LCBzd2FwU3BlYykge1xuICAgIGNvbnN0IGZpcnN0ID0gY29udGVudFswXVxuICAgIGNvbnN0IGxhc3QgPSBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV1cbiAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbFRhcmdldCkge1xuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gMFxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gdGFyZ2V0LnNjcm9sbEhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3dhcFNwZWMuc2hvdykge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0KSB7XG4gICAgICAgIGxldCB0YXJnZXRTdHIgPSBzd2FwU3BlYy5zaG93VGFyZ2V0XG4gICAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0ID09PSAnd2luZG93Jykge1xuICAgICAgICAgIHRhcmdldFN0ciA9ICdib2R5J1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCB0YXJnZXRTdHIpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBldmFsQXNEZWZhdWx0XG4gKiBAcGFyYW0ge09iamVjdD19IHZhbHVlc1xuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICB2YWx1ZXMgPSB7fVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZXNcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgICBsZXQgc3RyID0gYXR0cmlidXRlVmFsdWUudHJpbSgpXG4gICAgICBsZXQgZXZhbHVhdGVWYWx1ZSA9IGV2YWxBc0RlZmF1bHRcbiAgICAgIGlmIChzdHIgPT09ICd1bnNldCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDExKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdHIuaW5kZXhPZignanM6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigzKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCd7JykgIT09IDApIHtcbiAgICAgICAgc3RyID0gJ3snICsgc3RyICsgJ30nXG4gICAgICB9XG4gICAgICBsZXQgdmFyc1ZhbHVlc1xuICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkgeyByZXR1cm4gRnVuY3Rpb24oJ3JldHVybiAoJyArIHN0ciArICcpJykoKSB9LCB7fSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBwYXJzZUpTT04oc3RyKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFyc1ZhbHVlcykge1xuICAgICAgICBpZiAodmFyc1ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gdmFyc1ZhbHVlc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7KCkgPT4gYW55fSB0b0V2YWxcbiAgICogQHBhcmFtIHthbnk9fSBkZWZhdWx0VmFsXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUV2YWwoZWx0LCB0b0V2YWwsIGRlZmF1bHRWYWwpIHtcbiAgICBpZiAoaHRteC5jb25maWcuYWxsb3dFdmFsKSB7XG4gICAgICByZXR1cm4gdG9FdmFsKClcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpldmFsRGlzYWxsb3dlZEVycm9yJylcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFycycsIHRydWUsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFscycsIGZhbHNlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBnZXRFeHByZXNzaW9uVmFycyhlbHQpIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3RzKGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0KSwgZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGhlYWRlclZhbHVlXG4gICAqL1xuICBmdW5jdGlvbiBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpIHtcbiAgICBpZiAoaGVhZGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBPbiBhbiBleGNlcHRpb24sIHRyeSB0byBzZXQgdGhlIGhlYWRlciBVUkkgZW5jb2RlZCBpbnN0ZWFkXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgZW5jb2RlVVJJQ29tcG9uZW50KGhlYWRlclZhbHVlKSlcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyICsgJy1VUkktQXV0b0VuY29kZWQnLCAndHJ1ZScpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocikge1xuICAvLyBOQjogSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgc3R1ZmZcbiAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICYmIHR5cGVvZiAoVVJMKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoeGhyLnJlc3BvbnNlVVJMKVxuICAgICAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJhZFJlc3BvbnNlVXJsJywgeyB1cmw6IHhoci5yZXNwb25zZVVSTCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzSGVhZGVyKHhociwgcmVnZXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cC50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZXMgYW4gaHRteC1zdHlsZSBBSkFYIHJlcXVlc3RcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWpheFxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBVUkwgcGF0aCB0byBtYWtlIHRoZSBBSkFYXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd8SHRteEFqYXhIZWxwZXJDb250ZXh0fSBjb250ZXh0IHRoZSBlbGVtZW50IHRvIHRhcmdldCAoZGVmYXVsdHMgdG8gdGhlICoqYm9keSoqKSB8IGEgc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgfCBhIGNvbnRleHQgb2JqZWN0IHRoYXQgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmdcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5IGlmIG5vIHJlcXVlc3QgaXMgc2VudCwgb3Igd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgZnVuY3Rpb24gYWpheEhlbHBlcih2ZXJiLCBwYXRoLCBjb250ZXh0KSB7XG4gICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8odmVyYi50b0xvd2VyQ2FzZSgpKSlcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dCksXG4gICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgcmVzb2x2ZVRhcmdldChjb250ZXh0LnNvdXJjZSksIGNvbnRleHQuZXZlbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGFuZGxlcjogY29udGV4dC5oYW5kbGVyLFxuICAgICAgICAgICAgaGVhZGVyczogY29udGV4dC5oZWFkZXJzLFxuICAgICAgICAgICAgdmFsdWVzOiBjb250ZXh0LnZhbHVlcyxcbiAgICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQudGFyZ2V0KSxcbiAgICAgICAgICAgIHN3YXBPdmVycmlkZTogY29udGV4dC5zd2FwLFxuICAgICAgICAgICAgc2VsZWN0OiBjb250ZXh0LnNlbGVjdCxcbiAgICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGhpZXJhcmNoeUZvckVsdChlbHQpIHtcbiAgICBjb25zdCBhcnIgPSBbXVxuICAgIHdoaWxlIChlbHQpIHtcbiAgICAgIGFyci5wdXNoKGVsdClcbiAgICAgIGVsdCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB2ZXJpZnlQYXRoKGVsdCwgcGF0aCwgcmVxdWVzdENvbmZpZykge1xuICAgIGxldCBzYW1lSG9zdFxuICAgIGxldCB1cmxcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXJsID0gbmV3IFVSTChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKVxuICAgICAgY29uc3Qgb3JpZ2luID0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgICBzYW1lSG9zdCA9IG9yaWdpbiA9PT0gdXJsLm9yaWdpblxuICAgIH0gZWxzZSB7XG4gICAgLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgVVJMXG4gICAgICB1cmwgPSBwYXRoXG4gICAgICBzYW1lSG9zdCA9IHN0YXJ0c1dpdGgocGF0aCwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5zZWxmUmVxdWVzdHNPbmx5KSB7XG4gICAgICBpZiAoIXNhbWVIb3N0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGVVcmwnLCBtZXJnZU9iamVjdHMoeyB1cmwsIHNhbWVIb3N0IH0sIHJlcXVlc3RDb25maWcpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZvcm1EYXRhfSBvYmpcbiAgICogQHJldHVybiB7Rm9ybURhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvcm1EYXRhKSByZXR1cm4gb2JqXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0uZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9ialtrZXldLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgIShvYmpba2V5XSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgSlNPTi5zdHJpbmdpZnkob2JqW2tleV0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhQXJyYXlQcm94eShmb3JtRGF0YSwgbmFtZSwgYXJyYXkpIHtcbiAgICAvLyBtdXRhdGluZyB0aGUgYXJyYXkgc2hvdWxkIG11dGF0ZSB0aGUgdW5kZXJseWluZyBmb3JtIGRhdGFcbiAgICByZXR1cm4gbmV3IFByb3h5KGFycmF5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIGlmIChrZXkgPT09ICdsZW5ndGgnKSByZXR1cm4gdGFyZ2V0Lmxlbmd0aFxuICAgICAgICBpZiAoa2V5ID09PSAncHVzaCcpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpXG4gICAgICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldFtrZXldICYmIHRhcmdldFtrZXldLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFQcm94eShmb3JtRGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZm9ybURhdGEsIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHN5bWJvbCBjYWxscyB0byB0aGUgRm9ybURhdGEgaXRzZWxmIGRpcmVjdGx5XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgbmFtZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ3RvSlNPTicpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IEpTT04uc3RyaW5naWZ5IGNhbGwgb24gcHJveHlcbiAgICAgICAgICByZXR1cm4gKCkgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lIGluIHRhcmdldCkge1xuICAgICAgICAgIC8vIFdyYXAgaW4gZnVuY3Rpb24gd2l0aCBhcHBseSB0byBjb3JyZWN0bHkgYmluZCB0aGUgRm9ybURhdGEgY29udGV4dCwgYXMgYSBkaXJlY3QgY2FsbCB3b3VsZCByZXN1bHQgaW4gYW4gaWxsZWdhbCBpbnZvY2F0aW9uIGVycm9yXG4gICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcm1EYXRhW25hbWVdLmFwcGx5KGZvcm1EYXRhLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXkgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgICAgLy8gVGhvc2UgMiB1bmRlZmluZWQgJiBzaW5nbGUgdmFsdWUgcmV0dXJucyBhcmUgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkgYXMgd2Ugd2VyZW4ndCB1c2luZyBGb3JtRGF0YSBiZWZvcmVcbiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gYXJyYXlbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZm9ybURhdGFBcnJheVByb3h5KHRhcmdldCwgbmFtZSwgYXJyYXkpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IHRhcmdldC5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEodmFsdWUgaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICAvLyBTdXBwb3J0IE9iamVjdC5hc3NpZ24gY2FsbCBmcm9tIHByb3h5XG4gICAgICBvd25LZXlzOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSlcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRhcmdldCwgcHJvcCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCksIHByb3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7SHRteEFqYXhFdGN9IFtldGNdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmZpcm1lZF1cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCBjb25maXJtZWQpIHtcbiAgICBsZXQgcmVzb2x2ZSA9IG51bGxcbiAgICBsZXQgcmVqZWN0ID0gbnVsbFxuICAgIGV0YyA9IGV0YyAhPSBudWxsID8gZXRjIDoge31cbiAgICBpZiAoZXRjLnJldHVyblByb21pc2UgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICByZWplY3QgPSBfcmVqZWN0XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIGVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZUhhbmRsZXIgPSBldGMuaGFuZGxlciB8fCBoYW5kbGVBamF4UmVzcG9uc2VcbiAgICBjb25zdCBzZWxlY3QgPSBldGMuc2VsZWN0IHx8IG51bGxcblxuICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAvLyBkbyBub3QgaXNzdWUgcmVxdWVzdHMgZm9yIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV0Yy50YXJnZXRPdmVycmlkZSB8fCBhc0VsZW1lbnQoZ2V0VGFyZ2V0KGVsdCkpXG4gICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IHRhcmdldCA9PSBEVU1NWV9FTFQpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGFyZ2V0RXJyb3InLCB7IHRhcmdldDogZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JykgfSlcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGxldCBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBjb25zdCBzdWJtaXR0ZXIgPSBlbHREYXRhLmxhc3RCdXR0b25DbGlja2VkXG5cbiAgICBpZiAoc3VibWl0dGVyKSB7XG4gICAgICBjb25zdCBidXR0b25QYXRoID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1hY3Rpb24nKVxuICAgICAgaWYgKGJ1dHRvblBhdGggIT0gbnVsbCkge1xuICAgICAgICBwYXRoID0gYnV0dG9uUGF0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25WZXJiID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1tZXRob2QnKVxuICAgICAgaWYgKGJ1dHRvblZlcmIgIT0gbnVsbCkge1xuICAgICAgLy8gaWdub3JlIGJ1dHRvbnMgd2l0aCBmb3JtbWV0aG9kPVwiZGlhbG9nXCJcbiAgICAgICAgaWYgKGJ1dHRvblZlcmIudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyhidXR0b25WZXJiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm1RdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1jb25maXJtJylcbiAgICAvLyBhbGxvdyBldmVudC1iYXNlZCBjb25maXJtYXRpb24gdy8gYSBjYWxsYmFja1xuICAgIGlmIChjb25maXJtZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNzdWVSZXF1ZXN0ID0gZnVuY3Rpb24oc2tpcENvbmZpcm1hdGlvbikge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsICEhc2tpcENvbmZpcm1hdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpcm1EZXRhaWxzID0geyB0YXJnZXQsIGVsdCwgcGF0aCwgdmVyYiwgdHJpZ2dlcmluZ0V2ZW50OiBldmVudCwgZXRjLCBpc3N1ZVJlcXVlc3QsIHF1ZXN0aW9uOiBjb25maXJtUXVlc3Rpb24gfVxuICAgICAgaWYgKHRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpcm0nLCBjb25maXJtRGV0YWlscykgPT09IGZhbHNlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzeW5jRWx0ID0gZWx0XG4gICAgbGV0IHN5bmNTdHJhdGVneSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zeW5jJylcbiAgICBsZXQgcXVldWVTdHJhdGVneSA9IG51bGxcbiAgICBsZXQgYWJvcnRhYmxlID0gZmFsc2VcbiAgICBpZiAoc3luY1N0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBzeW5jU3RyaW5ncyA9IHN5bmNTdHJhdGVneS5zcGxpdCgnOicpXG4gICAgICBjb25zdCBzZWxlY3RvciA9IHN5bmNTdHJpbmdzWzBdLnRyaW0oKVxuICAgICAgaWYgKHNlbGVjdG9yID09PSAndGhpcycpIHtcbiAgICAgICAgc3luY0VsdCA9IGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC1zeW5jJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN5bmNFbHQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHNlbGVjdG9yKSlcbiAgICAgIH1cbiAgICAgIC8vIGRlZmF1bHQgdG8gdGhlIGRyb3Agc3RyYXRlZ3lcbiAgICAgIHN5bmNTdHJhdGVneSA9IChzeW5jU3RyaW5nc1sxXSB8fCAnZHJvcCcpLnRyaW0oKVxuICAgICAgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShzeW5jRWx0KVxuICAgICAgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Ryb3AnICYmIGVsdERhdGEueGhyICYmIGVsdERhdGEuYWJvcnRhYmxlICE9PSB0cnVlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdhYm9ydCcpIHtcbiAgICAgICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhYm9ydGFibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAncmVwbGFjZScpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5LmluZGV4T2YoJ3F1ZXVlJykgPT09IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVTdHJBcnJheSA9IHN5bmNTdHJhdGVneS5zcGxpdCgnICcpXG4gICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAocXVldWVTdHJBcnJheVsxXSB8fCAnbGFzdCcpLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgaWYgKGVsdERhdGEuYWJvcnRhYmxlKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZlbnQpXG4gICAgICAgICAgICBpZiAoZXZlbnREYXRhICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyAmJiBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWUpIHtcbiAgICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9IGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gJ2xhc3QnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID09IG51bGwpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2ZpcnN0JyAmJiBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdsYXN0Jykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXSAvLyBkdW1wIGV4aXN0aW5nIHF1ZXVlXG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGVsdERhdGEueGhyID0geGhyXG4gICAgZWx0RGF0YS5hYm9ydGFibGUgPSBhYm9ydGFibGVcbiAgICBjb25zdCBlbmRSZXF1ZXN0TG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWx0RGF0YS54aHIgPSBudWxsXG4gICAgICBlbHREYXRhLmFib3J0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyAhPSBudWxsICYmXG4gICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVkUmVxdWVzdCA9IGVsdERhdGEucXVldWVkUmVxdWVzdHMuc2hpZnQoKVxuICAgICAgICBxdWV1ZWRSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvbXB0UXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHJvbXB0JylcbiAgICBpZiAocHJvbXB0UXVlc3Rpb24pIHtcbiAgICAgIHZhciBwcm9tcHRSZXNwb25zZSA9IHByb21wdChwcm9tcHRRdWVzdGlvbilcbiAgICAgIC8vIHByb21wdCByZXR1cm5zIG51bGwgaWYgY2FuY2VsbGVkIGFuZCBlbXB0eSBzdHJpbmcgaWYgYWNjZXB0ZWQgd2l0aCBubyBlbnRyeVxuICAgICAgaWYgKHByb21wdFJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgICAhdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cHJvbXB0JywgeyBwcm9tcHQ6IHByb21wdFJlc3BvbnNlLCB0YXJnZXQgfSkpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybVF1ZXN0aW9uICYmICFjb25maXJtZWQpIHtcbiAgICAgIGlmICghY29uZmlybShjb25maXJtUXVlc3Rpb24pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHRSZXNwb25zZSlcblxuICAgIGlmICh2ZXJiICE9PSAnZ2V0JyAmJiAhdXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICB9XG5cbiAgICBpZiAoZXRjLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMgPSBtZXJnZU9iamVjdHMoaGVhZGVycywgZXRjLmhlYWRlcnMpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpXG4gICAgbGV0IGVycm9ycyA9IHJlc3VsdHMuZXJyb3JzXG4gICAgY29uc3QgcmF3Rm9ybURhdGEgPSByZXN1bHRzLmZvcm1EYXRhXG4gICAgaWYgKGV0Yy52YWx1ZXMpIHtcbiAgICAgIG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGZvcm1EYXRhRnJvbU9iamVjdChldGMudmFsdWVzKSlcbiAgICB9XG4gICAgY29uc3QgZXhwcmVzc2lvblZhcnMgPSBmb3JtRGF0YUZyb21PYmplY3QoZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSlcbiAgICBjb25zdCBhbGxGb3JtRGF0YSA9IG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGV4cHJlc3Npb25WYXJzKVxuICAgIGxldCBmaWx0ZXJlZEZvcm1EYXRhID0gZmlsdGVyVmFsdWVzKGFsbEZvcm1EYXRhLCBlbHQpXG5cbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSAmJiB2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgZmlsdGVyZWRGb3JtRGF0YS5zZXQoJ29yZy5odG14LmNhY2hlLWJ1c3RlcicsIGdldFJhd0F0dHJpYnV0ZSh0YXJnZXQsICdpZCcpIHx8ICd0cnVlJylcbiAgICB9XG5cbiAgICAvLyBiZWhhdmlvciBvZiBhbmNob3JzIHcvIGVtcHR5IGhyZWYgaXMgdG8gdXNlIHRoZSBjdXJyZW50IFVSTFxuICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aCA9PT0gJycpIHtcbiAgICAgIHBhdGggPSBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtub0hlYWRlcnNdXG4gICAgICovXG4gICAgY29uc3QgcmVxdWVzdEF0dHJWYWx1ZXMgPSBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXJlcXVlc3QnKVxuXG4gICAgY29uc3QgZWx0SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHVzZVVybFBhcmFtcyA9IGh0bXguY29uZmlnLm1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zLmluZGV4T2YodmVyYikgPj0gMFxuXG4gICAgLyoqIEB0eXBlIEh0bXhSZXF1ZXN0Q29uZmlnICovXG4gICAgY29uc3QgcmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHVzZVVybFBhcmFtcyxcbiAgICAgIGZvcm1EYXRhOiBmaWx0ZXJlZEZvcm1EYXRhLFxuICAgICAgcGFyYW1ldGVyczogZm9ybURhdGFQcm94eShmaWx0ZXJlZEZvcm1EYXRhKSxcbiAgICAgIHVuZmlsdGVyZWRGb3JtRGF0YTogYWxsRm9ybURhdGEsXG4gICAgICB1bmZpbHRlcmVkUGFyYW1ldGVyczogZm9ybURhdGFQcm94eShhbGxGb3JtRGF0YSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdmVyYixcbiAgICAgIGVycm9ycyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogZXRjLmNyZWRlbnRpYWxzIHx8IHJlcXVlc3RBdHRyVmFsdWVzLmNyZWRlbnRpYWxzIHx8IGh0bXguY29uZmlnLndpdGhDcmVkZW50aWFscyxcbiAgICAgIHRpbWVvdXQ6IGV0Yy50aW1lb3V0IHx8IHJlcXVlc3RBdHRyVmFsdWVzLnRpbWVvdXQgfHwgaHRteC5jb25maWcudGltZW91dCxcbiAgICAgIHBhdGgsXG4gICAgICB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50XG4gICAgfVxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maWdSZXF1ZXN0JywgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICAvLyBjb3B5IG91dCBpbiBjYXNlIHRoZSBvYmplY3Qgd2FzIG92ZXJ3cml0dGVuXG4gICAgcGF0aCA9IHJlcXVlc3RDb25maWcucGF0aFxuICAgIHZlcmIgPSByZXF1ZXN0Q29uZmlnLnZlcmJcbiAgICBoZWFkZXJzID0gcmVxdWVzdENvbmZpZy5oZWFkZXJzXG4gICAgZmlsdGVyZWRGb3JtRGF0YSA9IGZvcm1EYXRhRnJvbU9iamVjdChyZXF1ZXN0Q29uZmlnLnBhcmFtZXRlcnMpXG4gICAgZXJyb3JzID0gcmVxdWVzdENvbmZpZy5lcnJvcnNcbiAgICB1c2VVcmxQYXJhbXMgPSByZXF1ZXN0Q29uZmlnLnVzZVVybFBhcmFtc1xuXG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGlvbjpoYWx0ZWQnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0UGF0aCA9IHBhdGguc3BsaXQoJyMnKVxuICAgIGNvbnN0IHBhdGhOb0FuY2hvciA9IHNwbGl0UGF0aFswXVxuICAgIGNvbnN0IGFuY2hvciA9IHNwbGl0UGF0aFsxXVxuXG4gICAgbGV0IGZpbmFsUGF0aCA9IHBhdGhcbiAgICBpZiAodXNlVXJsUGFyYW1zKSB7XG4gICAgICBmaW5hbFBhdGggPSBwYXRoTm9BbmNob3JcbiAgICAgIGNvbnN0IGhhc1ZhbHVlcyA9ICFmaWx0ZXJlZEZvcm1EYXRhLmtleXMoKS5uZXh0KCkuZG9uZVxuICAgICAgaWYgKGhhc1ZhbHVlcykge1xuICAgICAgICBpZiAoZmluYWxQYXRoLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJz8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcmJ1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsUGF0aCArPSB1cmxFbmNvZGUoZmlsdGVyZWRGb3JtRGF0YSlcbiAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnIycgKyBhbmNob3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdmVyaWZ5UGF0aChlbHQsIGZpbmFsUGF0aCwgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6aW52YWxpZFBhdGgnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgeGhyLm9wZW4odmVyYi50b1VwcGVyQ2FzZSgpLCBmaW5hbFBhdGgsIHRydWUpXG4gICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvaHRtbCcpXG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHJlcXVlc3RDb25maWcud2l0aENyZWRlbnRpYWxzXG4gICAgeGhyLnRpbWVvdXQgPSByZXF1ZXN0Q29uZmlnLnRpbWVvdXRcblxuICAgIC8vIHJlcXVlc3QgaGVhZGVyc1xuICAgIGlmIChyZXF1ZXN0QXR0clZhbHVlcy5ub0hlYWRlcnMpIHtcbiAgICAvLyBpZ25vcmUgYWxsIGhlYWRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlcl1cbiAgICAgICAgICBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0h0bXhSZXNwb25zZUluZm99ICovXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvID0ge1xuICAgICAgeGhyLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcmVxdWVzdENvbmZpZyxcbiAgICAgIGV0YyxcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHNlbGVjdCxcbiAgICAgIHBhdGhJbmZvOiB7XG4gICAgICAgIHJlcXVlc3RQYXRoOiBwYXRoLFxuICAgICAgICBmaW5hbFJlcXVlc3RQYXRoOiBmaW5hbFBhdGgsXG4gICAgICAgIHJlc3BvbnNlUGF0aDogbnVsbCxcbiAgICAgICAgYW5jaG9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGllcmFyY2h5ID0gaGllcmFyY2h5Rm9yRWx0KGVsdClcbiAgICAgICAgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aCA9IGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKVxuICAgICAgICByZXNwb25zZUhhbmRsZXIoZWx0LCByZXNwb25zZUluZm8pXG4gICAgICAgIGlmIChyZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgIT09IHRydWUpIHtcbiAgICAgICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAvLyBpZiB0aGUgYm9keSBubyBsb25nZXIgY29udGFpbnMgdGhlIGVsZW1lbnQsIHRyaWdnZXIgdGhlIGV2ZW50IG9uIHRoZSBjbG9zZXN0IHBhcmVudFxuICAgICAgICAvLyByZW1haW5pbmcgaW4gdGhlIERPTVxuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgbGV0IHNlY29uZGFyeVRyaWdnZXJFbHQgPSBudWxsXG4gICAgICAgICAgd2hpbGUgKGhpZXJhcmNoeS5sZW5ndGggPiAwICYmIHNlY29uZGFyeVRyaWdnZXJFbHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50RWx0SW5IaWVyYXJjaHkgPSBoaWVyYXJjaHkuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKGJvZHlDb250YWlucyhwYXJlbnRFbHRJbkhpZXJhcmNoeSkpIHtcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IHBhcmVudEVsdEluSGllcmFyY2h5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWNvbmRhcnlUcmlnZ2VyRWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14Om9uTG9hZEVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgdGhyb3cgZVxuICAgICAgfVxuICAgIH1cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRBYm9ydCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRpbWVvdXQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVJlcXVlc3QnLCByZXNwb25zZUluZm8pKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIHZhciBpbmRpY2F0b3JzID0gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KVxuICAgIHZhciBkaXNhYmxlRWx0cyA9IGRpc2FibGVFbGVtZW50cyhlbHQpXG5cbiAgICBmb3JFYWNoKFsnbG9hZHN0YXJ0JywgJ2xvYWRlbmQnLCAncHJvZ3Jlc3MnLCAnYWJvcnQnXSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBmb3JFYWNoKFt4aHIsIHhoci51cGxvYWRdLCBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnhocjonICsgZXZlbnROYW1lLCB7XG4gICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudC5sZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogZXZlbnQudG90YWxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVNlbmQnLCByZXNwb25zZUluZm8pXG4gICAgY29uc3QgcGFyYW1zID0gdXNlVXJsUGFyYW1zID8gbnVsbCA6IGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkRm9ybURhdGEpXG4gICAgeGhyLnNlbmQocGFyYW1zKVxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlVcGRhdGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3R5cGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFtwYXRoXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICogQHJldHVybiB7SHRteEhpc3RvcnlVcGRhdGV9XG4gICAqL1xuICBmdW5jdGlvbiBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBGaXJzdCBjb25zdWx0IHJlc3BvbnNlIGhlYWRlcnNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IHBhdGhGcm9tSGVhZGVycyA9IG51bGxcbiAgICBsZXQgdHlwZUZyb21IZWFkZXJzID0gbnVsbFxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaC1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVwbGFjZS1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlcGxhY2UtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdyZXBsYWNlJ1xuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIHdhcyBhIHJlc3BvbnNlIGhlYWRlciwgdGhhdCBoYXMgcHJpb3JpdHlcbiAgICBpZiAocGF0aEZyb21IZWFkZXJzKSB7XG4gICAgICBpZiAocGF0aEZyb21IZWFkZXJzID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0eXBlRnJvbUhlYWRlcnMsXG4gICAgICAgICAgcGF0aDogcGF0aEZyb21IZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTmV4dCByZXNvbHZlIHZpYSBET00gdmFsdWVzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmZpbmFsUmVxdWVzdFBhdGhcbiAgICBjb25zdCByZXNwb25zZVBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoXG5cbiAgICBjb25zdCBwdXNoVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXB1c2gtdXJsJylcbiAgICBjb25zdCByZXBsYWNlVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXJlcGxhY2UtdXJsJylcbiAgICBjb25zdCBlbGVtZW50SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHNhdmVUeXBlID0gbnVsbFxuICAgIGxldCBwYXRoID0gbnVsbFxuXG4gICAgaWYgKHB1c2hVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcHVzaFVybFxuICAgIH0gZWxzZSBpZiAocmVwbGFjZVVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncmVwbGFjZSdcbiAgICAgIHBhdGggPSByZXBsYWNlVXJsXG4gICAgfSBlbHNlIGlmIChlbGVtZW50SXNCb29zdGVkKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgIC8vIGZhbHNlIGluZGljYXRlcyBubyBwdXNoLCByZXR1cm4gZW1wdHkgb2JqZWN0XG4gICAgICBpZiAocGF0aCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgLy8gdHJ1ZSBpbmRpY2F0ZXMgd2Ugd2FudCB0byBmb2xsb3cgd2hlcmV2ZXIgdGhlIHNlcnZlciBlbmRlZCB1cCBzZW5kaW5nIHVzXG4gICAgICBpZiAocGF0aCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgICB9XG5cbiAgICAgIC8vIHJlc3RvcmUgYW55IGFuY2hvciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RcbiAgICAgIGlmIChyZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yICYmIHBhdGguaW5kZXhPZignIycpID09PSAtMSkge1xuICAgICAgICBwYXRoID0gcGF0aCArICcjJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogc2F2ZVR5cGUsXG4gICAgICAgIHBhdGhcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9IHJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0NvbmZpZywgc3RhdHVzKSB7XG4gICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVzcG9uc2VIYW5kbGluZ0NvbmZpZy5jb2RlKVxuICAgIHJldHVybiByZWdFeHAudGVzdChzdGF0dXMudG9TdHJpbmcoMTApKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ31cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnICovXG4gICAgICB2YXIgcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQgPSBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nW2ldXG4gICAgICBpZiAoY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQsIHhoci5zdGF0dXMpKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUhhbmRsaW5nRWxlbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBubyBtYXRjaGVzLCByZXR1cm4gbm8gc3dhcFxuICAgIHJldHVybiB7XG4gICAgICBzd2FwOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRpdGxlKHRpdGxlKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBjb25zdCB0aXRsZUVsdCA9IGZpbmQoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsdCkge1xuICAgICAgICB0aXRsZUVsdC5pbm5lckhUTUwgPSB0aXRsZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnRpdGxlID0gdGl0bGVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUFqYXhSZXNwb25zZShlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcbiAgICBsZXQgdGFyZ2V0ID0gcmVzcG9uc2VJbmZvLnRhcmdldFxuICAgIGNvbnN0IGV0YyA9IHJlc3BvbnNlSW5mby5ldGNcbiAgICBjb25zdCByZXNwb25zZUluZm9TZWxlY3QgPSByZXNwb25zZUluZm8uc2VsZWN0XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZU9uTG9hZCcsIHJlc3BvbnNlSW5mbykpIHJldHVyblxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyOi9pKSkge1xuICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyJywgZWx0KVxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtTG9jYXRpb246L2kpKSB7XG4gICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgbGV0IHJlZGlyZWN0UGF0aCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtTG9jYXRpb24nKVxuICAgICAgLyoqIEB0eXBlIHtIdG14QWpheEhlbHBlckNvbnRleHQme3BhdGg6c3RyaW5nfX0gKi9cbiAgICAgIHZhciByZWRpcmVjdFN3YXBTcGVjXG4gICAgICBpZiAocmVkaXJlY3RQYXRoLmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgICByZWRpcmVjdFN3YXBTcGVjID0gcGFyc2VKU09OKHJlZGlyZWN0UGF0aClcbiAgICAgICAgLy8gd2hhdCdzIHRoZSBiZXN0IHdheSB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdXNlciBkaWRuJ3QgaW5jbHVkZSB0aGlzXG4gICAgICAgIHJlZGlyZWN0UGF0aCA9IHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgICBkZWxldGUgcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICB9XG4gICAgICBhamF4SGVscGVyKCdnZXQnLCByZWRpcmVjdFBhdGgsIHJlZGlyZWN0U3dhcFNwZWMpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShyZWRpcmVjdFBhdGgpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUmVmcmVzaCA9IGhhc0hlYWRlcih4aHIsIC9IWC1SZWZyZXNoOi9pKSAmJiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZnJlc2gnKSA9PT0gJ3RydWUnXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlZGlyZWN0Oi9pKSkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24uaHJlZiA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVkaXJlY3QnKVxuICAgICAgc2hvdWxkUmVmcmVzaCAmJiBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlZnJlc2gpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGlzdG9yeVVwZGF0ZSA9IGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKVxuXG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGluZyA9IHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocilcbiAgICBjb25zdCBzaG91bGRTd2FwID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwXG4gICAgbGV0IGlzRXJyb3IgPSAhIXJlc3BvbnNlSGFuZGxpbmcuZXJyb3JcbiAgICBsZXQgaWdub3JlVGl0bGUgPSBodG14LmNvbmZpZy5pZ25vcmVUaXRsZSB8fCByZXNwb25zZUhhbmRsaW5nLmlnbm9yZVRpdGxlXG4gICAgbGV0IHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zZWxlY3RcbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy50YXJnZXQpIHtcbiAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSlcbiAgICB9XG4gICAgdmFyIHN3YXBPdmVycmlkZSA9IGV0Yy5zd2FwT3ZlcnJpZGVcbiAgICBpZiAoc3dhcE92ZXJyaWRlID09IG51bGwgJiYgcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGUpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlXG4gICAgfVxuXG4gICAgLy8gcmVzcG9uc2UgaGVhZGVycyBvdmVycmlkZSByZXNwb25zZSBoYW5kbGluZyBjb25maWdcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgIH1cblxuICAgIHZhciBzZXJ2ZXJSZXNwb25zZSA9IHhoci5yZXNwb25zZVxuICAgIC8qKiBAdHlwZSBIdG14QmVmb3JlU3dhcERldGFpbHMgKi9cbiAgICB2YXIgYmVmb3JlU3dhcERldGFpbHMgPSBtZXJnZU9iamVjdHMoe1xuICAgICAgc2hvdWxkU3dhcCxcbiAgICAgIHNlcnZlclJlc3BvbnNlLFxuICAgICAgaXNFcnJvcixcbiAgICAgIGlnbm9yZVRpdGxlLFxuICAgICAgc2VsZWN0T3ZlcnJpZGVcbiAgICB9LCByZXNwb25zZUluZm8pXG5cbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy5ldmVudCAmJiAhdHJpZ2dlckV2ZW50KHRhcmdldCwgcmVzcG9uc2VIYW5kbGluZy5ldmVudCwgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6YmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgc2VydmVyUmVzcG9uc2UgPSBiZWZvcmVTd2FwRGV0YWlscy5zZXJ2ZXJSZXNwb25zZSAvLyBhbGxvdyB1cGRhdGluZyBjb250ZW50XG4gICAgaXNFcnJvciA9IGJlZm9yZVN3YXBEZXRhaWxzLmlzRXJyb3IgLy8gYWxsb3cgdXBkYXRpbmcgZXJyb3JcbiAgICBpZ25vcmVUaXRsZSA9IGJlZm9yZVN3YXBEZXRhaWxzLmlnbm9yZVRpdGxlIC8vIGFsbG93IHVwZGF0aW5nIGlnbm9yaW5nIHRpdGxlXG4gICAgc2VsZWN0T3ZlcnJpZGUgPSBiZWZvcmVTd2FwRGV0YWlscy5zZWxlY3RPdmVycmlkZSAvLyBhbGxvdyB1cGRhdGluZyBzZWxlY3Qgb3ZlcnJpZGVcblxuICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSB0YXJnZXQgLy8gTWFrZSB1cGRhdGVkIHRhcmdldCBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLmZhaWxlZCA9IGlzRXJyb3IgLy8gTWFrZSBmYWlsZWQgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5zdWNjZXNzZnVsID0gIWlzRXJyb3IgLy8gTWFrZSBzdWNjZXNzZnVsIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcblxuICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjg2KSB7XG4gICAgICAgIGNhbmNlbFBvbGxpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IGV4dGVuc2lvbi50cmFuc2Zvcm1SZXNwb25zZShzZXJ2ZXJSZXNwb25zZSwgeGhyLCBlbHQpXG4gICAgICB9KVxuXG4gICAgICAvLyBTYXZlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSB3aWxsIGJlIGEgaGlzdG9yeSB1cGRhdGVcbiAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICAgIH1cbiAgICAgIHZhciBzd2FwU3BlYyA9IGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcE92ZXJyaWRlKVxuXG4gICAgICBpZiAoIXN3YXBTcGVjLmhhc093blByb3BlcnR5KCdpZ25vcmVUaXRsZScpKSB7XG4gICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gaWdub3JlVGl0bGVcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcblxuICAgICAgLy8gb3B0aW9uYWwgdHJhbnNpdGlvbiBBUEkgcHJvbWlzZSBjYWxsYmFja3NcbiAgICAgIGxldCBzZXR0bGVSZXNvbHZlID0gbnVsbFxuICAgICAgbGV0IHNldHRsZVJlamVjdCA9IG51bGxcblxuICAgICAgaWYgKHJlc3BvbnNlSW5mb1NlbGVjdCkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSW5mb1NlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc2VsZWN0Oi9pKSkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzZWxlY3QnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3RPT0IgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0LW9vYicpXG4gICAgICBjb25zdCBzZWxlY3QgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0JylcblxuICAgICAgbGV0IGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGlmIHdlIG5lZWQgdG8gc2F2ZSBoaXN0b3J5LCBkbyBzbywgYmVmb3JlIHN3YXBwaW5nIHNvIHRoYXQgcmVsYXRpdmUgcmVzb3VyY2VzIGhhdmUgdGhlIGNvcnJlY3QgYmFzZSBVUkxcbiAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5VXBkYXRlJywgbWVyZ2VPYmplY3RzKHsgaGlzdG9yeTogaGlzdG9yeVVwZGF0ZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnB1c2hlZEludG9IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VVcmxJbkhpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpyZXBsYWNlZEluSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dhcCh0YXJnZXQsIHNlcnZlclJlc3BvbnNlLCBzd2FwU3BlYywge1xuICAgICAgICAgICAgc2VsZWN0OiBzZWxlY3RPdmVycmlkZSB8fCBzZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3RPT0IsXG4gICAgICAgICAgICBldmVudEluZm86IHJlc3BvbnNlSW5mbyxcbiAgICAgICAgICAgIGFuY2hvcjogcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvcixcbiAgICAgICAgICAgIGNvbnRleHRFbGVtZW50OiBlbHQsXG4gICAgICAgICAgICBhZnRlclN3YXBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1Td2FwOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1Td2FwJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlclNldHRsZUNhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVNldHRsZTovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlc29sdmUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3dhcEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZWplY3QpXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBzaG91bGRUcmFuc2l0aW9uID0gaHRteC5jb25maWcuZ2xvYmFsVmlld1RyYW5zaXRpb25zXG4gICAgICBpZiAoc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ3RyYW5zaXRpb24nKSkge1xuICAgICAgICBzaG91bGRUcmFuc2l0aW9uID0gc3dhcFNwZWMudHJhbnNpdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVUcmFuc2l0aW9uJywgcmVzcG9uc2VJbmZvKSAmJlxuICAgICAgICAgICAgICB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBjb25zdCBzZXR0bGVQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgICBzZXR0bGVSZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgICBzZXR0bGVSZWplY3QgPSBfcmVqZWN0XG4gICAgICAgIH0pXG4gICAgICAgIC8vIHdyYXAgdGhlIG9yaWdpbmFsIGRvU3dhcCgpIGluIGEgY2FsbCB0byBzdGFydFZpZXdUcmFuc2l0aW9uKClcbiAgICAgICAgY29uc3QgaW5uZXJEb1N3YXAgPSBkb1N3YXBcbiAgICAgICAgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5uZXJEb1N3YXAoKVxuICAgICAgICAgICAgcmV0dXJuIHNldHRsZVByb21pc2VcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzd2FwU3BlYy5zd2FwRGVsYXkgPiAwKSB7XG4gICAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9Td2FwLCBzd2FwU3BlYy5zd2FwRGVsYXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1N3YXAoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNFcnJvcikge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpyZXNwb25zZUVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6ICdSZXNwb25zZSBTdGF0dXMgRXJyb3IgQ29kZSAnICsgeGhyLnN0YXR1cyArICcgZnJvbSAnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlcXVlc3RQYXRoIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXh0ZW5zaW9ucyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIEh0bXhFeHRlbnNpb24+fSAqL1xuICBjb25zdCBleHRlbnNpb25zID0ge31cblxuICAvKipcbiAgICogZXh0ZW5zaW9uQmFzZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYWxsIGV4dGVuc2lvbnMuXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZXh0ZW5zaW9uQmFzZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5pdDogZnVuY3Rpb24oYXBpKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgb25FdmVudDogZnVuY3Rpb24obmFtZSwgZXZ0KSB7IHJldHVybiB0cnVlIH0sXG4gICAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24odGV4dCwgeGhyLCBlbHQpIHsgcmV0dXJuIHRleHQgfSxcbiAgICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgaGFuZGxlU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24oeGhyLCBwYXJhbWV0ZXJzLCBlbHQpIHsgcmV0dXJuIG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZWZpbmVFeHRlbnNpb24gaW5pdGlhbGl6ZXMgdGhlIGV4dGVuc2lvbiBhbmQgYWRkcyBpdCB0byB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNkZWZpbmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbn0gZXh0ZW5zaW9uIHRoZSBleHRlbnNpb24gZGVmaW5pdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gZGVmaW5lRXh0ZW5zaW9uKG5hbWUsIGV4dGVuc2lvbikge1xuICAgIGlmIChleHRlbnNpb24uaW5pdCkge1xuICAgICAgZXh0ZW5zaW9uLmluaXQoaW50ZXJuYWxBUEkpXG4gICAgfVxuICAgIGV4dGVuc2lvbnNbbmFtZV0gPSBtZXJnZU9iamVjdHMoZXh0ZW5zaW9uQmFzZSgpLCBleHRlbnNpb24pXG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlRXh0ZW5zaW9uIHJlbW92ZXMgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFeHRlbnNpb24obmFtZSkge1xuICAgIGRlbGV0ZSBleHRlbnNpb25zW25hbWVdXG4gIH1cblxuICAvKipcbiAgICogZ2V0RXh0ZW5zaW9ucyBzZWFyY2hlcyB1cCB0aGUgRE9NIHRyZWUgdG8gcmV0dXJuIGFsbCBleHRlbnNpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbltdPX0gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nW109fSBleHRlbnNpb25zVG9JZ25vcmVcbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEV4dGVuc2lvbnMoZWx0LCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSkge1xuICAgIGlmIChleHRlbnNpb25zVG9SZXR1cm4gPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9SZXR1cm4gPSBbXVxuICAgIH1cbiAgICBpZiAoZWx0ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbnNUb1JldHVyblxuICAgIH1cbiAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlID0gW11cbiAgICB9XG4gICAgY29uc3QgZXh0ZW5zaW9uc0ZvckVsZW1lbnQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1leHQnKVxuICAgIGlmIChleHRlbnNpb25zRm9yRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChleHRlbnNpb25zRm9yRWxlbWVudC5zcGxpdCgnLCcpLCBmdW5jdGlvbihleHRlbnNpb25OYW1lKSB7XG4gICAgICAgIGV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb25OYW1lLnJlcGxhY2UoLyAvZywgJycpXG4gICAgICAgIGlmIChleHRlbnNpb25OYW1lLnNsaWNlKDAsIDcpID09ICdpZ25vcmU6Jykge1xuICAgICAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZS5wdXNoKGV4dGVuc2lvbk5hbWUuc2xpY2UoNykpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZS5pbmRleE9mKGV4dGVuc2lvbk5hbWUpIDwgMCkge1xuICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uTmFtZV1cbiAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmIGV4dGVuc2lvbnNUb1JldHVybi5pbmRleE9mKGV4dGVuc2lvbikgPCAwKSB7XG4gICAgICAgICAgICBleHRlbnNpb25zVG9SZXR1cm4ucHVzaChleHRlbnNpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEluaXRpYWxpemF0aW9uXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpc1JlYWR5ID0gZmFsc2VcbiAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgaXNSZWFkeSA9IHRydWVcbiAgfSlcblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIG5vdyBpZiBET01Db250ZW50TG9hZGVkIGhhcyBmaXJlZCwgb3RoZXJ3aXNlIGxpc3RlbiBmb3IgaXQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdXNlcyBpc1JlYWR5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGFzayB0aGUgYnJvd3NlciB3aGV0aGVyXG4gICAqIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gZmlyZWQ7IHRoZXJlJ3MgYSBnYXAgYmV0d2VlbiBET01Db250ZW50TG9hZGVkXG4gICAqIGZpcmluZyBhbmQgcmVhZHlzdGF0ZT1jb21wbGV0ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWR5KGZuKSB7XG4gICAgLy8gQ2hlY2tpbmcgcmVhZHlTdGF0ZSBoZXJlIGlzIGEgZmFpbHNhZmUgaW4gY2FzZSB0aGUgaHRteCBzY3JpcHQgdGFnIGVudGVyZWQgdGhlIERPTSBieVxuICAgIC8vIHNvbWUgbWVhbnMgb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQuXG4gICAgaWYgKGlzUmVhZHkgfHwgZ2V0RG9jdW1lbnQoKS5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICBmbigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydEluZGljYXRvclN0eWxlcygpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaW5jbHVkZUluZGljYXRvclN0eWxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG5vbmNlQXR0cmlidXRlID0gaHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZSA/IGAgbm9uY2U9XCIke2h0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2V9XCJgIDogJydcbiAgICAgIGdldERvY3VtZW50KCkuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsXG4gICAgICAgICc8c3R5bGUnICsgbm9uY2VBdHRyaWJ1dGUgKyAnPlxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjB9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJyAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJy4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgPC9zdHlsZT4nKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1ldGFDb25maWcoKSB7XG4gICAgLyoqIEB0eXBlIEhUTUxNZXRhRWxlbWVudCAqL1xuICAgIGNvbnN0IGVsZW1lbnQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImh0bXgtY29uZmlnXCJdJylcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHBhcnNlSlNPTihlbGVtZW50LmNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VNZXRhQ29uZmlnKCkge1xuICAgIGNvbnN0IG1ldGFDb25maWcgPSBnZXRNZXRhQ29uZmlnKClcbiAgICBpZiAobWV0YUNvbmZpZykge1xuICAgICAgaHRteC5jb25maWcgPSBtZXJnZU9iamVjdHMoaHRteC5jb25maWcsIG1ldGFDb25maWcpXG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnRcbiAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgbWVyZ2VNZXRhQ29uZmlnKClcbiAgICBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKVxuICAgIGxldCBib2R5ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgcHJvY2Vzc05vZGUoYm9keSlcbiAgICBjb25zdCByZXN0b3JlZEVsdHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIltoeC10cmlnZ2VyPSdyZXN0b3JlZCddLFtkYXRhLWh4LXRyaWdnZXI9J3Jlc3RvcmVkJ11cIlxuICAgIClcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWJvcnQnLCBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXRcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YSh0YXJnZXQpXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhICYmIGludGVybmFsRGF0YS54aHIpIHtcbiAgICAgICAgaW50ZXJuYWxEYXRhLnhoci5hYm9ydCgpXG4gICAgICB9XG4gICAgfSlcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIGNvbnN0IG9yaWdpbmFsUG9wc3RhdGUgPSB3aW5kb3cub25wb3BzdGF0ZSA/IHdpbmRvdy5vbnBvcHN0YXRlLmJpbmQod2luZG93KSA6IG51bGxcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5zdGF0ZSAmJiBldmVudC5zdGF0ZS5odG14KSB7XG4gICAgICAgIHJlc3RvcmVIaXN0b3J5KClcbiAgICAgICAgZm9yRWFjaChyZXN0b3JlZEVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnJlc3RvcmVkJywge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGdldERvY3VtZW50KCksXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsUG9wc3RhdGUpIHtcbiAgICAgICAgICBvcmlnaW5hbFBvcHN0YXRlKGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoYm9keSwgJ2h0bXg6bG9hZCcsIHt9KSAvLyBnaXZlIHJlYWR5IGhhbmRsZXJzIGEgY2hhbmNlIHRvIGxvYWQgdXAgYmVmb3JlIGZpcmluZyB0aGlzIGV2ZW50XG4gICAgICBib2R5ID0gbnVsbCAvLyBraWxsIHJlZmVyZW5jZSBmb3IgZ2NcbiAgICB9LCAwKVxuICB9KVxuXG4gIHJldHVybiBodG14XG59KSgpXG5cbi8qKiBAdHlwZWRlZiB7J2dldCd8J2hlYWQnfCdwb3N0J3wncHV0J3wnZGVsZXRlJ3wnY29ubmVjdCd8J29wdGlvbnMnfCd0cmFjZSd8J3BhdGNoJ30gSHR0cFZlcmIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2FwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdE9PQl1cbiAqIEBwcm9wZXJ0eSB7Kn0gW2V2ZW50SW5mb11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYW5jaG9yXVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbY29udGV4dEVsZW1lbnRdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU3dhcENhbGxiYWNrXVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclNldHRsZUNhbGxiYWNrXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHN3YXBDYWxsYmFja1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeydpbm5lckhUTUwnIHwgJ291dGVySFRNTCcgfCAnYmVmb3JlYmVnaW4nIHwgJ2FmdGVyYmVnaW4nIHwgJ2JlZm9yZWVuZCcgfCAnYWZ0ZXJlbmQnIHwgJ2RlbGV0ZScgfCAnbm9uZScgfCBzdHJpbmd9IEh0bXhTd2FwU3R5bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEh0bXhTd2FwU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzd2FwRGVsYXlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZXR0bGVEZWxheVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJhbnNpdGlvbl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoZWFkXVxuICogQHByb3BlcnR5IHsndG9wJyB8ICdib3R0b20nfSBbc2Nyb2xsXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JvbGxUYXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3ddXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3dUYXJnZXRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb2N1c1Njcm9sbF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKHRoaXM6Tm9kZSwgZXZ0OkV2ZW50KSA9PiBib29sZWFuKSAmIHtzb3VyY2U6IHN0cmluZ319IENvbmRpdGlvbmFsRnVuY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9sbEludGVydmFsXVxuICogQHByb3BlcnR5IHtDb25kaXRpb25hbEZ1bmN0aW9ufSBbZXZlbnRGaWx0ZXJdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjaGFuZ2VkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbb25jZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnN1bWVdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmcm9tXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Rocm90dGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9vdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyZXNob2xkXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tlbHQ6IEVsZW1lbnQsIG1lc3NhZ2U6IHN0cmluZywgdmFsaWRpdHk6IFZhbGlkaXR5U3RhdGV9fSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gSFgtUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlclxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlci1OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UYXJnZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIWC1DdXJyZW50LVVSTFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtIWC1Qcm9tcHRdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUJvb3N0ZWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0NvbnRlbnQtVHlwZV1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3RdXG4gKi9cblxuLyoqIEB0eXBlZGVmIEh0bXhBamF4SGVscGVyQ29udGV4dFxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3NvdXJjZV1cbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IFtldmVudF1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlVXJsUGFyYW1zXG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHBhcmFtZXRlcnMgZm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IHVuZmlsdGVyZWRGb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHVuZmlsdGVyZWRQYXJhbWV0ZXJzIHVuZmlsdGVyZWRGb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn0gaGVhZGVyc1xuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEBwcm9wZXJ0eSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpdGhDcmVkZW50aWFsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoXG4gKiBAcHJvcGVydHkge0V2ZW50fSB0cmlnZ2VyaW5nRXZlbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUluZm9cbiAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhFdGN9IGV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VsZWN0XG4gKiBAcHJvcGVydHkge3tyZXF1ZXN0UGF0aDogc3RyaW5nLCBmaW5hbFJlcXVlc3RQYXRoOiBzdHJpbmcsIHJlc3BvbnNlUGF0aDogc3RyaW5nfG51bGwsIGFuY2hvcjogc3RyaW5nfX0gcGF0aEluZm9cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N1Y2Nlc3NmdWxdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtrZWVwSW5kaWNhdG9yc11cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhBamF4RXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXR1cm5Qcm9taXNlXVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFt0YXJnZXRPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2RlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBzd2FwXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlcnJvcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtldmVudF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIdG14UmVzcG9uc2VJbmZvICYge3Nob3VsZFN3YXA6IGJvb2xlYW4sIHNlcnZlclJlc3BvbnNlOiBhbnksIGlzRXJyb3I6IGJvb2xlYW4sIGlnbm9yZVRpdGxlOiBib29sZWFuLCBzZWxlY3RPdmVycmlkZTpzdHJpbmd9fSBIdG14QmVmb3JlU3dhcERldGFpbHNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBIdG14QWpheEhhbmRsZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygoKSA9PiB2b2lkKX0gSHRteFNldHRsZVRhc2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhTZXR0bGVJbmZvXG4gKiBAcHJvcGVydHkge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gZWx0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aXRsZV1cbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgtZXh0ZW5zaW9ucy9ibG9iL21haW4vUkVBRE1FLm1kXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14RXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkgeyhhcGk6IGFueSkgPT4gdm9pZH0gaW5pdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnR8Q3VzdG9tRXZlbnQpID0+IGJvb2xlYW59IG9uRXZlbnRcbiAqIEBwcm9wZXJ0eSB7KHRleHQ6IHN0cmluZywgeGhyOiBYTUxIdHRwUmVxdWVzdCwgZWx0OiBFbGVtZW50KSA9PiBzdHJpbmd9IHRyYW5zZm9ybVJlc3BvbnNlXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpID0+IGJvb2xlYW59IGlzSW5saW5lU3dhcFxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLCB0YXJnZXQ6IE5vZGUsIGZyYWdtZW50OiBOb2RlLCBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbykgPT4gYm9vbGVhbnxOb2RlW119IGhhbmRsZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHhocjogWE1MSHR0cFJlcXVlc3QsIHBhcmFtZXRlcnM6IEZvcm1EYXRhLCBlbHQ6IE5vZGUpID0+ICp8c3RyaW5nfG51bGx9IGVuY29kZVBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nW118bnVsbH0gZ2V0U2VsZWN0b3JzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGh0bXhcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBkZXBlbmRzT24ocGF0aFNwZWM6IGFueSwgdXJsOiBzdHJpbmcpIHtcbiAgaWYgKHBhdGhTcGVjID09PSBcImlnbm9yZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGRlcGVuZGVuY3lQYXRoID0gcGF0aFNwZWMuc3BsaXQoXCIvXCIpO1xuICBjb25zdCB1cmxQYXRoID0gdXJsLnNwbGl0KFwiL1wiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeUVsZW1lbnQgPSBkZXBlbmRlbmN5UGF0aC5zaGlmdCgpO1xuICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gdXJsUGF0aFtpXTtcbiAgICBpZiAoZGVwZW5kZW5jeUVsZW1lbnQgIT09IHBhdGhFbGVtZW50ICYmIGRlcGVuZGVuY3lFbGVtZW50ICE9PSBcIipcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDAgfHxcbiAgICAgIChkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDEgJiYgZGVwZW5kZW5jeVBhdGhbMF0gPT09IFwiXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgZWx0c1dpdGhEZXBzID0gaHRteC5maW5kQWxsKFwiW3BhdGgtZGVwc11cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0c1dpdGhEZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZWx0ID0gZWx0c1dpdGhEZXBzW2ldO1xuICAgIGlmIChkZXBlbmRzT24oZWx0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSwgcGF0aCkpIHtcbiAgICAgIGh0bXgudHJpZ2dlcihlbHQsIFwicGF0aC1kZXBzXCIsIG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInBhdGgtZGVwc1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmJlZm9yZU9uTG9hZFwiKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBldnQuZGV0YWlsLnJlcXVlc3RDb25maWc7XG4gICAgICAvLyBtdXRhdGluZyBjYWxsXG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZyAmJlxuICAgICAgICBjb25maWcudmVyYiAhPT0gXCJnZXRcIiAmJlxuICAgICAgICBldnQudGFyZ2V0ICE9IG51bGwgJiZcbiAgICAgICAgZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgZXZ0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIikgIT09IFwiaWdub3JlXCJcbiAgICAgICkge1xuICAgICAgICByZWZyZXNoUGF0aChjb25maWcucGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCwge0h0bXhTZXR0bGVJbmZvLCBIdG14U3dhcFN0eWxlfSBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbn1cblxuY29uc3QgaWdub3JlZEV2ZW50cyA9IFsnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCAnaHRteDpiZWZvcmVTd2FwJywgJ2h0bXg6YWZ0ZXJTd2FwJywgJ2h0bXg6YmVmb3JlT25Mb2FkJywgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCAnaHRteDpjb25maWdSZXF1ZXN0JywgJ2h0bXg6Y29uZmlnUmVzcG9uc2UnLCAnaHRteDpyZXNwb25zZUVycm9yJ107XG5cbmZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWU6IHN0cmluZywgZGV0YWlsOiBhbnkpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG59XG5cbmZ1bmN0aW9uIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQ6IEhUTUxFbGVtZW50LCBuYW1lOiBzdHJpbmcsIGV2ZW50OiBDdXN0b21FdmVudCwgdHJpZ2dlcmVkOiBTZXQ8SFRNTEVsZW1lbnQ+KSB7XG4gICAgaWYoaWdub3JlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY2hpbGRyZW4pIHtcbiAgICAgICAgQXJyYXkuZnJvbSh0YXJnZXQuY2hpbGRyZW4pLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtlaGFiID0ga2ViYWJFdmVudE5hbWUobmFtZSk7XG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBrZWhhYi5yZXBsYWNlKFwiaHRteDpcIiwgXCJoeC1vbjo6XCIpXG4gICAgICAgICAgICBpZiAoIXRyaWdnZXJlZC5oYXMoZSBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBpZihlLmhhc0F0dHJpYnV0ZShldmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZS5yZXBsYWNlKFwiaHgtb246OlwiLCBcImh0bXg6XCIpLCBldmVudC5kZXRhaWwpXG4gICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmRldGFpbC5tZXRhID0gJ3RyaWdnZXItY2hpbGRyZW4nXG4gICAgICAgICAgICAgICAgICAgIGUuZGlzcGF0Y2hFdmVudChuZXdFdmVudClcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkLmFkZChlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoaWxkcmVuKGUgYXMgSFRNTEVsZW1lbnQsIG5hbWUsIGV2ZW50LCB0cmlnZ2VyZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwidHJpZ2dlci1jaGlsZHJlblwiLCB7XG4gICAgb25FdmVudDogKG5hbWUsIGV2dDogRXZlbnQgfCBDdXN0b21FdmVudCkgPT4ge1xuICAgICAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZihldnQuZGV0YWlsLm1ldGEgPT09ICd0cmlnZ2VyLWNoaWxkcmVuJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyaWdnZXJlZCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfHwgZXZ0LmRldGFpbC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQsIG5hbWUsIGV2dCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpOiBhbnkpOiB2b2lkIHtcbiAgICB9LFxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbiAoXG4gICAgICAgIHRleHQ6IHN0cmluZyxcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgZWx0OiBFbGVtZW50LFxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH0sXG4gICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbiAoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uIChcbiAgICAgICAgc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLFxuICAgICAgICB0YXJnZXQ6IE5vZGUsXG4gICAgICAgIGZyYWdtZW50OiBOb2RlLFxuICAgICAgICBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbyxcbiAgICApOiBib29sZWFuIHwgTm9kZVtdIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24gKFxuICAgICAgICB4aHI6IFhNTEh0dHBSZXF1ZXN0LFxuICAgICAgICBwYXJhbWV0ZXJzOiBGb3JtRGF0YSxcbiAgICAgICAgZWx0OiBOb2RlLFxuICAgICkge1xuICAgIH0sXG4gICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbiAoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiZGVidWdcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoY29uc29sZS5kZWJ1Zykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhuYW1lLCBldnQpO1xuICAgIH0gZWxzZSBpZiAoY29uc29sZSkge1xuICAgICAgY29uc29sZS5sb2coXCJERUJVRzpcIiwgbmFtZSwgZXZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm9vcFxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5jb25zdCBjb25maWc6IGFueSA9IGh0bXguY29uZmlnO1xuXG4vKiogQHR5cGUge2ltcG9ydChcIi4uL2h0bXhcIikuSHRteEludGVybmFsQXBpfSAqL1xubGV0IGFwaTogYW55O1xuXG5jb25zdCBhdHRyUHJlZml4ID0gXCJoeC10YXJnZXQtXCI7XG5cbi8vIElFMTEgZG9lc24ndCBzdXBwb3J0IHN0cmluZy5zdGFydHNXaXRoXG5mdW5jdGlvbiBzdGFydHNXaXRoKHN0cjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZykge1xuICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHJlc3BDb2RlTnVtYmVyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfVxuICovXG5mdW5jdGlvbiBnZXRSZXNwQ29kZVRhcmdldChlbHQ6IEVsZW1lbnQsIHJlc3BDb2RlTnVtYmVyOiBudW1iZXIpIHtcbiAgaWYgKCFlbHQgfHwgIXJlc3BDb2RlTnVtYmVyKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCByZXNwQ29kZSA9IHJlc3BDb2RlTnVtYmVyLnRvU3RyaW5nKCk7XG5cbiAgLy8gJyonIGlzIHRoZSBvcmlnaW5hbCBzeW50YXgsIGFzIHRoZSBvYnZpb3VzIGNoYXJhY3RlciBmb3IgYSB3aWxkY2FyZC5cbiAgLy8gVGhlICd4JyBhbHRlcm5hdGl2ZSB3YXMgYWRkZWQgZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIEhUTUxcbiAgLy8gdGVtcGxhdGluZyBlbmdpbmVzLCBkdWUgdG8gYW1iaWd1aXR5IGFyb3VuZCB3aGljaCBjaGFyYWN0ZXJzIGFyZVxuICAvLyBzdXBwb3J0ZWQgaW4gSFRNTCBhdHRyaWJ1dGVzLlxuICAvL1xuICAvLyBTdGFydCB3aXRoIHRoZSBtb3N0IHNwZWNpZmljIHBvc3NpYmxlIGF0dHJpYnV0ZSBhbmQgZ2VuZXJhbGl6ZSBmcm9tXG4gIC8vIHRoZXJlLlxuICBjb25zdCBhdHRyUG9zc2liaWxpdGllcyA9IFtcbiAgICByZXNwQ29kZSxcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwieFwiLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4XCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieHhcIixcblxuICAgIFwiKlwiLFxuICAgIFwieFwiLFxuICAgIFwiKioqXCIsXG4gICAgXCJ4eHhcIixcbiAgXTtcbiAgaWYgKHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNFwiKSB8fCBzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjVcIikpIHtcbiAgICBhdHRyUG9zc2liaWxpdGllcy5wdXNoKFwiZXJyb3JcIik7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJQb3NzaWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXR0ciA9IGF0dHJQcmVmaXggKyBhdHRyUG9zc2liaWxpdGllc1tpXTtcbiAgICBjb25zdCBhdHRyVmFsdWUgPSBhcGkuZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cik7XG4gICAgaWYgKGF0dHJWYWx1ZSkge1xuICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gXCJ0aGlzXCIpIHtcbiAgICAgICAgcmV0dXJuIGFwaS5maW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhcGkucXVlcnlTZWxlY3RvckV4dChlbHQsIGF0dHJWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBAcGFyYW0ge0V2ZW50fSBldnQgKi9cbmZ1bmN0aW9uIGhhbmRsZUVycm9yRmxhZyhldnQ6IEN1c3RvbUV2ZW50KSB7XG4gIGlmIChldnQuZGV0YWlsLmlzRXJyb3IpIHtcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IpIHtcbiAgICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IpIHtcbiAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSB0cnVlO1xuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicmVzcG9uc2UtdGFyZ2V0c1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaW5pdDogKGFwaVJlZikgPT4ge1xuICAgIGFwaSA9IGFwaVJlZjtcblxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5hbWUgPT09IFwiaHRteDpiZWZvcmVTd2FwXCIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyICYmXG4gICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMgIT09IDIwMFxuICAgICkge1xuICAgICAgaWYgKGV2dC5kZXRhaWwudGFyZ2V0KSB7XG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcpIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgJiZcbiAgICAgICAgICBldnQuZGV0YWlsLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5tYXRjaCgvSFgtUmV0YXJnZXQ6L2kpXG4gICAgICAgICkge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0UmVzcENvZGVUYXJnZXQoXG4gICAgICAgIGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZy5lbHQsXG4gICAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyxcbiAgICAgICk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICBldnQuZGV0YWlsLnRhcmdldCA9IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibXV0YXRpb24tZXJyb3JcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDphZnRlclJlcXVlc3RcIikge1xuICAgICAgaWYgKCFldnQuZGV0YWlsIHx8ICFldnQuZGV0YWlsLnhocikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0dXMgPSBldnQuZGV0YWlsLnhoci5zdGF0dXM7XG4gICAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICBodG14LmZpbmRBbGwoXCJbaHgtb25cXFxcOlxcXFw6bXV0YXRpb24tZXJyb3JdXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgXCJodG14Om11dGF0aW9uLWVycm9yXCIsIHsgc3RhdHVzIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IHtjcmVhdGVXZWJTb2NrZXRDbGllbnR9IGZyb20gXCIuLi91dGlsL3dzXCI7XG5cbmxldCBsYXN0VmVyc2lvbiA9IFwiXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibGl2ZXJlbG9hZFwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBlbmFibGVkID0gZmFsc2VcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIEFycmF5LmZyb20oaHRteC5maW5kQWxsKFwiW2h4LWV4dF1cIikpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtZXh0XCIpO1xuICAgICAgICAgICAgaWYodmFsdWU/LnNwbGl0KFwiIFwiKS5pbmNsdWRlcyhcImxpdmVyZWxvYWRcIikpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ2xpdmVyZWxvYWQgZXh0ZW5zaW9uIGluaXRpYWxpemVkLicpO1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRXZlbnRTb3VyY2Ugb2JqZWN0IGFuZCBwb2ludCBpdCB0byB5b3VyIFNTRSBlbmRwb2ludFxuICAgICAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2Rldi9saXZlcmVsb2FkJyk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YVxuICAgICAgICAgICAgLy8gTG9nIHRoZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uICE9PSBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgIHJlbG9hZCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgKGUuZy4sIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkKVxuICAgICAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50U291cmNlIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgfTtcblxuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcblxuICAgIH0sXG59KTtcblxuZnVuY3Rpb24gcmVsb2FkKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxufSIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5jb25zdCBldmFsRnVuY1JlZ2V4ID0vX19ldmFsX1tBLVphLXowLTldK1xcKFthLXpdK1xcKS9nbVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImh0bWdvXCIsIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgIGlmKG5hbWUgPT09IFwiaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5cblxuXG5pbnRlcmZhY2UgSHRteEludGVybmFsQXBpIHtcbiAgICBnZXRJbnRlcm5hbERhdGEoZWx0OiBFbGVtZW50KTogYW55O1xuICAgIGJvZHlDb250YWlucyhlbHQ6IEVsZW1lbnQpOiBib29sZWFuO1xuICAgIGdldEF0dHJpYnV0ZVZhbHVlKGVsdDogRWxlbWVudCwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbDtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0OiBFbGVtZW50LCBuYW1lOiBzdHJpbmcsIGRldGFpbD86IGFueSk6IGJvb2xlYW47XG4gICAgd2l0aEV4dGVuc2lvbnMoZWx0OiBFbGVtZW50LCBjYWxsYmFjazogKGV4dGVuc2lvbjogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICBtYWtlU2V0dGxlSW5mbyhlbHQ6IEVsZW1lbnQpOiBhbnk7XG4gICAgbWFrZUZyYWdtZW50KGh0bWw6IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQ7XG4gICAgb29iU3dhcChzd2FwU3R5bGU6IHN0cmluZywgZnJhZ21lbnQ6IEVsZW1lbnQsIHNldHRsZUluZm86IGFueSk6IHZvaWQ7XG4gICAgc2V0dGxlSW1tZWRpYXRlbHkodGFza3M6IGFueSk6IHZvaWQ7XG4gICAgZ2V0Q2xvc2VzdE1hdGNoKGVsdDogRWxlbWVudCwgY29uZGl0aW9uOiAobm9kZTogRWxlbWVudCkgPT4gYm9vbGVhbik6IEVsZW1lbnQgfCBudWxsO1xuICAgIGdldFRyaWdnZXJTcGVjcyhlbHQ6IEVsZW1lbnQpOiBhbnlbXTtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQ6IEVsZW1lbnQsIHRyaWdnZXJTcGVjOiBhbnksIG5vZGVEYXRhOiBhbnksIGhhbmRsZXI6IChlbHQ6IEVsZW1lbnQsIGV2dDogRXZlbnQpID0+IHZvaWQpOiB2b2lkO1xuICAgIGdldEhlYWRlcnMoZWx0OiBFbGVtZW50LCB0YXJnZXQ6IEVsZW1lbnQpOiBhbnk7XG4gICAgZ2V0VGFyZ2V0KGVsdDogRWxlbWVudCk6IEVsZW1lbnQ7XG4gICAgZ2V0SW5wdXRWYWx1ZXMoZWx0OiBFbGVtZW50LCB2ZXJiOiBzdHJpbmcpOiB7IGVycm9yczogYW55W107IHZhbHVlczogYW55IH07XG4gICAgZ2V0RXhwcmVzc2lvblZhcnMoZWx0OiBFbGVtZW50KTogYW55O1xuICAgIG1lcmdlT2JqZWN0cyhvYmoxOiBhbnksIG9iajI6IGFueSk6IGFueTtcbiAgICBmaWx0ZXJWYWx1ZXModmFsdWVzOiBhbnksIGVsdDogRWxlbWVudCk6IGFueTtcbiAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQ/OiBFbGVtZW50LCBuYW1lPzogc3RyaW5nLCBkZXRhaWw/OiBhbnkpOiB2b2lkO1xuICAgIGhhc0F0dHJpYnV0ZShlbHQ6IEVsZW1lbnQsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgc2hvdWxkQ2FuY2VsKGV2dDogRXZlbnQsIGVsdDogRWxlbWVudCk6IGJvb2xlYW47XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5pbnRlcmZhY2UgV2ViU29ja2V0V3JhcHBlciB7XG4gICAgc29ja2V0OiBXZWJTb2NrZXQ7XG4gICAgZXZlbnRzIDogeyBba2V5OiBzdHJpbmddOiAoKGV2ZW50OiBFdmVudCkgPT4gdm9pZClbXSB9O1xuICAgIG1lc3NhZ2VRdWV1ZTogeyBtZXNzYWdlOiBzdHJpbmc7IHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsIH1bXTtcbiAgICByZXRyeUNvdW50OiBudW1iZXI7XG4gICAgc2VuZEltbWVkaWF0ZWx5KG1lc3NhZ2U6IHN0cmluZywgc2VuZEVsdDogRWxlbWVudCB8IG51bGwpOiB2b2lkO1xuICAgIHNlbmQobWVzc2FnZTogc3RyaW5nLCBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCk6IHZvaWQ7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkKTogdm9pZDtcbiAgICBoYW5kbGVRdWV1ZWRNZXNzYWdlcygpOiB2b2lkO1xuICAgIGluaXQoKTogdm9pZDtcbiAgICBjbG9zZSgpOiB2b2lkO1xuICAgIHB1YmxpY0ludGVyZmFjZToge1xuICAgICAgICBzZW5kOiAobWVzc2FnZTogc3RyaW5nLCBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCkgPT4gdm9pZDtcbiAgICAgICAgc2VuZEltbWVkaWF0ZWx5OiAobWVzc2FnZTogc3RyaW5nLCBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCkgPT4gdm9pZDtcbiAgICAgICAgcXVldWU6IHsgbWVzc2FnZTogc3RyaW5nOyBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCB9W107XG4gICAgfTtcbn1cblxubGV0IGFwaTogSHRteEludGVybmFsQXBpO1xuXG5mdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG59XG5cbmZ1bmN0aW9uIGdldExlZ2FjeVdlYnNvY2tldFVSTChlbHQ6IEVsZW1lbnQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxlZ2FjeVNTRVZhbHVlID0gYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXdzJyk7XG4gICAgaWYgKGxlZ2FjeVNTRVZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHNwbGl0T25XaGl0ZXNwYWNlKGxlZ2FjeVNTRVZhbHVlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldLnNwbGl0KC86KC4rKS8pO1xuICAgICAgICAgICAgaWYgKHZhbHVlWzBdID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZW5zdXJlV2ViU29ja2V0KHNvY2tldEVsdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBubyBsb25nZXIgZXhpc3RzLCB0aGVuXG4gICAgLy8gZG8gbm90IGNvbm5lY3QvcmVjb25uZWN0IHRoZSBXZWJTb2NrZXQuXG4gICAgaWYgKCFhcGkuYm9keUNvbnRhaW5zKHNvY2tldEVsdCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgc291cmNlIHN0cmFpZ2h0IGZyb20gdGhlIGVsZW1lbnQncyB2YWx1ZVxuICAgIGxldCB3c3NTb3VyY2UgPSBhcGkuZ2V0QXR0cmlidXRlVmFsdWUoc29ja2V0RWx0LCAnd3MtY29ubmVjdCcpO1xuXG4gICAgaWYgKHdzc1NvdXJjZSA9PSBudWxsIHx8IHdzc1NvdXJjZSA9PT0gJycpIHtcbiAgICAgICAgY29uc3QgbGVnYWN5U291cmNlID0gZ2V0TGVnYWN5V2Vic29ja2V0VVJMKHNvY2tldEVsdCk7XG4gICAgICAgIGlmIChsZWdhY3lTb3VyY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3NzU291cmNlID0gbGVnYWN5U291cmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR3VhcmFudGVlIHRoYXQgdGhlIHdzc1NvdXJjZSB2YWx1ZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBVUkxcbiAgICBpZiAod3NzU291cmNlLmluZGV4T2YoJy8nKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBiYXNlX3BhcnQgPSBsb2NhdGlvbi5ob3N0bmFtZSArIChsb2NhdGlvbi5wb3J0ID8gJzonICsgbG9jYXRpb24ucG9ydCA6ICcnKTtcbiAgICAgICAgaWYgKGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgICAgICAgd3NzU291cmNlID0gJ3dzczovLycgKyBiYXNlX3BhcnQgKyB3c3NTb3VyY2U7XG4gICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwOicpIHtcbiAgICAgICAgICAgIHdzc1NvdXJjZSA9ICd3czovLycgKyBiYXNlX3BhcnQgKyB3c3NTb3VyY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzb2NrZXRXcmFwcGVyID0gY3JlYXRlV2Vic29ja2V0V3JhcHBlcihzb2NrZXRFbHQsICgpID0+IGNyZWF0ZVdlYlNvY2tldCh3c3NTb3VyY2UpKTtcblxuICAgIHNvY2tldFdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAobWF5YmVDbG9zZVdlYlNvY2tldFNvdXJjZShzb2NrZXRFbHQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2UgPSAoZXZlbnQgYXMgTWVzc2FnZUV2ZW50KS5kYXRhO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhYXBpLnRyaWdnZXJFdmVudChzb2NrZXRFbHQsICdodG14OndzQmVmb3JlTWVzc2FnZScsIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICBzb2NrZXRXcmFwcGVyOiBzb2NrZXRXcmFwcGVyLnB1YmxpY0ludGVyZmFjZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBpLndpdGhFeHRlbnNpb25zKHNvY2tldEVsdCwgKGV4dGVuc2lvbikgPT4ge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2UocmVzcG9uc2UsIG51bGwsIHNvY2tldEVsdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oc29ja2V0RWx0KTtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBhcGkubWFrZUZyYWdtZW50KHJlc3BvbnNlKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZnJhZ21lbnQuY2hpbGRyZW4pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV1cbiAgICAgICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGRyZW5baV0sIHNldHRsZUluZm8pO1xuICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgICAgICBpZihjaGlsZC50YWdOYW1lID09PSAnU0NSSVBUJyAmJiBjaGlsZC5pZC5zdGFydHNXaXRoKFwiX19ldmFsXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFwaS5zZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKTtcbiAgICAgICAgYXBpLnRyaWdnZXJFdmVudChzb2NrZXRFbHQsICdodG14OndzQWZ0ZXJNZXNzYWdlJywge1xuICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2UsXG4gICAgICAgICAgICBzb2NrZXRXcmFwcGVyOiBzb2NrZXRXcmFwcGVyLnB1YmxpY0ludGVyZmFjZSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBQdXQgdGhlIFdlYlNvY2tldCBpbnRvIHRoZSBIVE1MIEVsZW1lbnQncyBjdXN0b20gZGF0YS5cbiAgICBhcGkuZ2V0SW50ZXJuYWxEYXRhKHNvY2tldEVsdCkud2ViU29ja2V0ID0gc29ja2V0V3JhcHBlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlV2Vic29ja2V0V3JhcHBlcihzb2NrZXRFbHQ6IEhUTUxFbGVtZW50LCBzb2NrZXRGdW5jOiAoKSA9PiBXZWJTb2NrZXQpOiBXZWJTb2NrZXRXcmFwcGVyIHtcbiAgICBjb25zdCB3cmFwcGVyOiBXZWJTb2NrZXRXcmFwcGVyID0ge1xuICAgICAgICBzb2NrZXQ6IG51bGwgYXMgdW5rbm93biBhcyBXZWJTb2NrZXQsXG4gICAgICAgIG1lc3NhZ2VRdWV1ZTogW10sXG4gICAgICAgIHJldHJ5Q291bnQ6IDAsXG4gICAgICAgIGV2ZW50czoge30gYXMgeyBba2V5OiBzdHJpbmddOiAoKGV2ZW50OiBFdmVudCkgPT4gdm9pZClbXSB9LFxuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IChldmVudDogRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZXZlbnRzW2V2ZW50XSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzW2V2ZW50XSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV2ZW50c1tldmVudF0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZEltbWVkaWF0ZWx5KG1lc3NhZ2U6IHN0cmluZywgc2VuZEVsdDogRWxlbWVudCB8IG51bGwpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zb2NrZXQpIHtcbiAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckVycm9yRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c0Vycm9yJywgeyBlcnJvcjogJ05vIHNvY2tldCBhdmFpbGFibGUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFzZW5kRWx0IHx8XG4gICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFdmVudChzZW5kRWx0LCAnaHRteDp3c0JlZm9yZVNlbmQnLCB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHNvY2tldFdyYXBwZXI6IHRoaXMucHVibGljSW50ZXJmYWNlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGlmIChzZW5kRWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoc2VuZEVsdCwgJ2h0bXg6d3NBZnRlclNlbmQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0V3JhcHBlcjogdGhpcy5wdWJsaWNJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2VuZChtZXNzYWdlOiBzdHJpbmcsIHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPT0gdGhpcy5zb2NrZXQuT1BFTikge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnB1c2goeyBtZXNzYWdlLCBzZW5kRWx0IH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRJbW1lZGlhdGVseShtZXNzYWdlLCBzZW5kRWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaGFuZGxlUXVldWVkTWVzc2FnZXMoKSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5tZXNzYWdlUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXVlZEl0ZW0gPSB0aGlzLm1lc3NhZ2VRdWV1ZVswXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuT1BFTikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmRJbW1lZGlhdGVseShxdWV1ZWRJdGVtLm1lc3NhZ2UsIHF1ZXVlZEl0ZW0uc2VuZEVsdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICAgICAgICAvLyBDbG9zZSBkaXNjYXJkZWQgc29ja2V0XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFdlYlNvY2tldCBhbmQgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgICAgIGNvbnN0IHNvY2tldCA9IHNvY2tldEZ1bmMoKTtcblxuICAgICAgICAgICAgLy8gVGhlIGV2ZW50LnR5cGUgZGV0YWlsIGlzIGFkZGVkIGZvciBpbnRlcmZhY2UgY29uZm9ybWFuY2Ugd2l0aCB0aGVcbiAgICAgICAgICAgIC8vIG90aGVyIHR3byBsaWZlY3ljbGUgZXZlbnRzIChvcGVuIGFuZCBjbG9zZSkgc28gYSBzaW5nbGUgaGFuZGxlciBtZXRob2RcbiAgICAgICAgICAgIC8vIGNhbiBoYW5kbGUgdGhlbSBwb2x5bW9ycGhpY2FsbHksIGlmIHJlcXVpcmVkLlxuICAgICAgICAgICAgYXBpLnRyaWdnZXJFdmVudChzb2NrZXRFbHQsICdodG14OndzQ29ubmVjdGluZycsIHsgZXZlbnQ6IHsgdHlwZTogJ2Nvbm5lY3RpbmcnIH0gfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuXG4gICAgICAgICAgICBzb2NrZXQub25vcGVuID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJldHJ5Q291bnQgPSAwO1xuICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c09wZW4nLCB7IGV2ZW50OiBlLCBzb2NrZXRXcmFwcGVyOiB0aGlzLnB1YmxpY0ludGVyZmFjZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXVlZE1lc3NhZ2VzKCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzb2NrZXQub25jbG9zZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc29ja2V0IHNob3VsZCBub3QgYmUgY29ubmVjdGVkLCBzdG9wIGZ1cnRoZXIgYXR0ZW1wdHMgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBJZiBBYm5vcm1hbCBDbG9zdXJlL1NlcnZpY2UgUmVzdGFydC9UcnkgQWdhaW4gTGF0ZXIsIHRoZW4gc2V0IGEgdGltZXIgdG8gcmVjb25uZWN0IGFmdGVyIGEgcGF1c2UuXG4gICAgICAgICAgICAgICAgaWYgKCFtYXliZUNsb3NlV2ViU29ja2V0U291cmNlKHNvY2tldEVsdCkgJiYgWzEwMDYsIDEwMTIsIDEwMTNdLmluZGV4T2YoZS5jb2RlKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkodGhpcy5yZXRyeUNvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJldHJ5Q291bnQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTm90aWZ5IGNsaWVudCBjb2RlIHRoYXQgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuIENsaWVudCBjb2RlIGNhbiBpbnNwZWN0IGBldmVudGAgZmllbGRcbiAgICAgICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgd2hldGhlciBjbG9zdXJlIGhhcyBiZWVuIHZhbGlkIG9yIGFibm9ybWFsXG4gICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFdmVudChzb2NrZXRFbHQsICdodG14OndzQ2xvc2UnLCB7IGV2ZW50OiBlLCBzb2NrZXRXcmFwcGVyOiB0aGlzLnB1YmxpY0ludGVyZmFjZSB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHNvY2tldC5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckVycm9yRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c0Vycm9yJywgeyBlcnJvcjogZSwgc29ja2V0V3JhcHBlcjogdGhpcyB9KTtcbiAgICAgICAgICAgICAgICBtYXliZUNsb3NlV2ViU29ja2V0U291cmNlKHNvY2tldEVsdCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBldmVudHMgPSB0aGlzLmV2ZW50cztcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50c1trXS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKGssIGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlKCkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcHVibGljSW50ZXJmYWNlOiB7fSBhcyBhbnksXG4gICAgfTtcblxuICAgIHdyYXBwZXIuaW5pdCgpO1xuXG4gICAgd3JhcHBlci5wdWJsaWNJbnRlcmZhY2UgPSB7XG4gICAgICAgIHNlbmQ6IHdyYXBwZXIuc2VuZC5iaW5kKHdyYXBwZXIpLFxuICAgICAgICBzZW5kSW1tZWRpYXRlbHk6IHdyYXBwZXIuc2VuZEltbWVkaWF0ZWx5LmJpbmQod3JhcHBlciksXG4gICAgICAgIHF1ZXVlOiB3cmFwcGVyLm1lc3NhZ2VRdWV1ZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVdlYlNvY2tldFNlbmQoZWx0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGxlZ2FjeUF0dHJpYnV0ZSA9IGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC13cycpO1xuICAgIGlmIChsZWdhY3lBdHRyaWJ1dGUgJiYgbGVnYWN5QXR0cmlidXRlICE9PSAnc2VuZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYlNvY2tldFBhcmVudCA9IGFwaS5nZXRDbG9zZXN0TWF0Y2goZWx0LCAobm9kZSkgPT4ge1xuICAgICAgICByZXR1cm4gaGFzV2ViU29ja2V0KG5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgIH0pO1xuICAgIGlmICh3ZWJTb2NrZXRQYXJlbnQpIHtcbiAgICAgICAgcHJvY2Vzc1dlYlNvY2tldFNlbmQod2ViU29ja2V0UGFyZW50IGFzIEhUTUxFbGVtZW50LCBlbHQpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFzV2ViU29ja2V0KG5vZGU6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFwaS5nZXRJbnRlcm5hbERhdGEobm9kZSkud2ViU29ja2V0ICE9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NXZWJTb2NrZXRTZW5kKHNvY2tldEVsdDogSFRNTEVsZW1lbnQsIHNlbmRFbHQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBhcGkuZ2V0SW50ZXJuYWxEYXRhKHNlbmRFbHQpO1xuICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGFwaS5nZXRUcmlnZ2VyU3BlY3Moc2VuZEVsdCk7XG4gICAgdHJpZ2dlclNwZWNzLmZvckVhY2goKHRzKSA9PiB7XG4gICAgICAgIGFwaS5hZGRUcmlnZ2VySGFuZGxlcihzZW5kRWx0LCB0cywgbm9kZURhdGEsIChlbHQ6IEVsZW1lbnQsIGV2dDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChtYXliZUNsb3NlV2ViU29ja2V0U291cmNlKHNvY2tldEVsdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvY2tldFdyYXBwZXI6IFdlYlNvY2tldFdyYXBwZXIgPSBhcGkuZ2V0SW50ZXJuYWxEYXRhKHNvY2tldEVsdCkud2ViU29ja2V0O1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IGFwaS5nZXRIZWFkZXJzKHNlbmRFbHQsIGFwaS5nZXRUYXJnZXQoc2VuZEVsdCkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGFwaS5nZXRJbnB1dFZhbHVlcyhzZW5kRWx0LCAncG9zdCcpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnM7XG4gICAgICAgICAgICBjb25zdCByYXdQYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgcmVzdWx0cy52YWx1ZXMpO1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvblZhcnMgPSBhcGkuZ2V0RXhwcmVzc2lvblZhcnMoc2VuZEVsdCk7XG4gICAgICAgICAgICBjb25zdCBhbGxQYXJhbWV0ZXJzID0gYXBpLm1lcmdlT2JqZWN0cyhyYXdQYXJhbWV0ZXJzLCBleHByZXNzaW9uVmFycyk7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFBhcmFtZXRlcnMgPSBhcGkuZmlsdGVyVmFsdWVzKGFsbFBhcmFtZXRlcnMsIHNlbmRFbHQpO1xuXG4gICAgICAgICAgICBjb25zdCBzZW5kQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IGZpbHRlcmVkUGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB1bmZpbHRlcmVkUGFyYW1ldGVyczogYWxsUGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIGVycm9ycyxcblxuICAgICAgICAgICAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZ0LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VCb2R5OiB1bmRlZmluZWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHNvY2tldFdyYXBwZXI6IHNvY2tldFdyYXBwZXIucHVibGljSW50ZXJmYWNlLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKCFhcGkudHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6d3NDb25maWdTZW5kJywgc2VuZENvbmZpZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGlvbjpoYWx0ZWQnLCBlcnJvcnMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGJvZHkgPSBzZW5kQ29uZmlnLm1lc3NhZ2VCb2R5O1xuICAgICAgICAgICAgaWYgKGJvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvU2VuZCA9IE9iamVjdC5hc3NpZ24oe30sIHNlbmRDb25maWcucGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbmRDb25maWcuaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICB0b1NlbmQuSEVBREVSUyA9IGhlYWRlcnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeSh0b1NlbmQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzb2NrZXRXcmFwcGVyLnNlbmQoYm9keSwgZWx0IGFzIEVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoZXZ0ICYmIGFwaS5zaG91bGRDYW5jZWwoZXZ0LCBlbHQgYXMgRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KHJldHJ5Q291bnQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgZXhwID0gTWF0aC5taW4ocmV0cnlDb3VudCwgNik7XG4gICAgY29uc3QgbWF4RGVsYXkgPSAxMDAwICogTWF0aC5wb3coMiwgZXhwKTtcbiAgICByZXR1cm4gbWF4RGVsYXkgKiBNYXRoLnJhbmRvbSgpO1xufVxuXG5mdW5jdGlvbiBtYXliZUNsb3NlV2ViU29ja2V0U291cmNlKGVsdDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIWFwaS5ib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICBhcGkuZ2V0SW50ZXJuYWxEYXRhKGVsdCkud2ViU29ja2V0LmNsb3NlKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldCh1cmw6IHN0cmluZyk6IFdlYlNvY2tldCB7XG4gICAgY29uc3Qgc29jayA9IG5ldyBXZWJTb2NrZXQodXJsLCBbXSk7XG4gICAgc29jay5iaW5hcnlUeXBlID0gKGh0bXguY29uZmlnLndzQmluYXJ5VHlwZSB8fCAnYmxvYicpIGFzIHVua25vd24gYXMgQmluYXJ5VHlwZTtcbiAgICByZXR1cm4gc29jaztcbn1cblxuZnVuY3Rpb24gcXVlcnlBdHRyaWJ1dGVPblRoaXNPckNoaWxkcmVuKGVsdDogSFRNTEVsZW1lbnQsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50W10ge1xuICAgIGNvbnN0IHJlc3VsdDogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgLy8gSWYgdGhlIHBhcmVudCBlbGVtZW50IGFsc28gY29udGFpbnMgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUsIHRoZW4gYWRkIGl0IHRvIHRoZSByZXN1bHRzIHRvby5cbiAgICBpZiAoYXBpLmhhc0F0dHJpYnV0ZShlbHQsIGF0dHJpYnV0ZU5hbWUpIHx8IGFwaS5oYXNBdHRyaWJ1dGUoZWx0LCAnaHgtd3MnKSkge1xuICAgICAgICByZXN1bHQucHVzaChlbHQpO1xuICAgIH1cblxuICAgIC8vIFNlYXJjaCBhbGwgY2hpbGQgbm9kZXMgdGhhdCBtYXRjaCB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZVxuICAgIGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIGF0dHJpYnV0ZU5hbWUgKyAnXSwgW2RhdGEtJyArIGF0dHJpYnV0ZU5hbWUgKyAnXSwgW2RhdGEtaHgtd3NdLCBbaHgtd3NdJykuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICByZXN1bHQucHVzaChub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2g8VD4oYXJyOiBUW10sIGZ1bmM6IChpdGVtOiBUKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKGFycikge1xuICAgICAgICBhcnIuZm9yRWFjaChmdW5jKTtcbiAgICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKCd3cycsIHtcbiAgICBpbml0OiAoYXBpUmVmOiBIdG14SW50ZXJuYWxBcGkpID0+IHtcbiAgICAgICAgLy8gU3RvcmUgcmVmZXJlbmNlIHRvIGludGVybmFsIEFQSVxuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiAobmFtZTogc3RyaW5nLCBldnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmVudDogRWxlbWVudCA9IGV2dC50YXJnZXQgYXMgRWxlbWVudCB8fCAoZXZ0IGFzIEN1c3RvbUV2ZW50KS5kZXRhaWwuZWx0O1xuXG4gICAgICAgIGlmKCEocGFyZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIGNsb3NlIHRoZSBzb2NrZXQgd2hlbiBlbGVtZW50cyBhcmUgcmVtb3ZlZFxuICAgICAgICAgICAgY2FzZSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCc6XG4gICAgICAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMocGFyZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBhcGkuZ2V0SW50ZXJuYWxEYXRhKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGludGVybmFsRGF0YS53ZWJTb2NrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxEYXRhLndlYlNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIFRyeSB0byBjcmVhdGUgd2Vic29ja2V0cyB3aGVuIGVsZW1lbnRzIGFyZSBwcm9jZXNzZWRcbiAgICAgICAgICAgIGNhc2UgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnOlxuICAgICAgICAgICAgICAgIGlmKHBhcmVudC5oYXNBdHRyaWJ1dGUoXCJ3cy1jb25uZWN0XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuc3VyZVdlYlNvY2tldChwYXJlbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKHBhcmVudC5oYXNBdHRyaWJ1dGUoXCJ3cy1zZW5kXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuc3VyZVdlYlNvY2tldFNlbmQocGFyZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy93c1wiXG5cbmZ1bmN0aW9uIHdhdGNoVXJsKGNhbGxiYWNrOiAob2xkVXJsOiBzdHJpbmcsIG5ld1VybDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGxldCBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHNldEludGVydmFsKCgpID0+IHtcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYgIT09IGxhc3RVcmwpIHtcbiAgICAgIGNhbGxiYWNrKGxhc3RVcmwsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgIGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG4gIH0sIDEwMCk7XG59XG5cbndhdGNoVXJsKChfLCBuZXdVcmwpID0+IHtcbiAgb25VcmxDaGFuZ2UobmV3VXJsKTtcbn0pO1xuXG5mdW5jdGlvbiBvblVybENoYW5nZShuZXdVcmw6IHN0cmluZykge1xuICBsZXQgdXJsID0gbmV3IFVSTChuZXdVcmwpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcl1cIikuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC10cmlnZ2VyXCIpO1xuICAgIGlmICghdHJpZ2dlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3BsaXQgPSB0cmlnZ2Vycy5zcGxpdChcIiwgXCIpO1xuICAgIGlmIChzcGxpdC5maW5kKChzKSA9PiBzID09PSBcInVybFwiKSkge1xuICAgICAgaHRteC5zd2FwKGVsZW1lbnQsIFwidXJsXCIsIHtcbiAgICAgICAgc3dhcFN0eWxlOiBcIm91dGVySFRNTFwiLFxuICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlc10gb2YgdXJsLnNlYXJjaFBhcmFtcykge1xuICAgICAgICBsZXQgZXZlbnROYW1lID0gXCJxczpcIiArIGtleTtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmluY2x1ZGVzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRyaWdnZXJpbmdcIiwgZXZlbnROYW1lKTtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgZXZlbnROYW1lLCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC1tYXRjaC1xcF1cIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBsZXQgaGFzTWF0Y2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGVsLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBuYW1lLnJlcGxhY2UoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiLCBcIlwiKTtcbiAgICAgICAgbGV0IHZhbHVlID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQobWF0Y2gpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBodG14LnN3YXAoZWwsIGVsLmdldEF0dHJpYnV0ZShuYW1lKSA/PyBcIlwiLCB7XG4gICAgICAgICAgICBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsXG4gICAgICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNNYXRjaCkge1xuICAgICAgbGV0IGRlZmF1bHRLZXkgPSBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1kZWZhdWx0XCIpO1xuICAgICAgaWYgKGRlZmF1bHRLZXkpIHtcbiAgICAgICAgaHRteC5zd2FwKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIgKyBkZWZhdWx0S2V5KSA/PyBcIlwiLFxuICAgICAgICAgIHsgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLCBzd2FwRGVsYXk6IDAsIHNldHRsZURlbGF5OiAwIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/framework/assets/js/htmxextensions/trigger-children.ts b/framework/assets/js/htmxextensions/trigger-children.ts index 7b30f44..f39fa23 100644 --- a/framework/assets/js/htmxextensions/trigger-children.ts +++ b/framework/assets/js/htmxextensions/trigger-children.ts @@ -4,6 +4,8 @@ function kebabEventName(str: string) { return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase() } +const ignoredEvents = ['htmx:beforeProcessNode', 'htmx:afterProcessNode', 'htmx:beforeSwap', 'htmx:afterSwap', 'htmx:beforeOnLoad', 'htmx:afterOnLoad', 'htmx:configRequest', 'htmx:configResponse', 'htmx:responseError']; + function makeEvent(eventName: string, detail: any) { let evt if (window.CustomEvent && typeof window.CustomEvent === 'function') { @@ -17,7 +19,9 @@ function makeEvent(eventName: string, detail: any) { } function triggerChildren(target: HTMLElement, name: string, event: CustomEvent, triggered: Set) { - event.detail.meta = 'trigger-children'; + if(ignoredEvents.includes(name)) { + return + } if (target && target.children) { Array.from(target.children).forEach((e) => { const kehab = kebabEventName(name); @@ -25,6 +29,7 @@ function triggerChildren(target: HTMLElement, name: string, event: CustomEvent, if (!triggered.has(e as HTMLElement)) { if(e.hasAttribute(eventName)) { const newEvent = makeEvent(eventName.replace("hx-on::", "htmx:"), event.detail) + newEvent.detail.meta = 'trigger-children' e.dispatchEvent(newEvent) triggered.add(e as HTMLElement); } diff --git a/framework/assets/js/htmxextensions/ws.ts b/framework/assets/js/htmxextensions/ws.ts index 3fdbc36..0879c5e 100644 --- a/framework/assets/js/htmxextensions/ws.ts +++ b/framework/assets/js/htmxextensions/ws.ts @@ -406,12 +406,13 @@ htmx.defineExtension('ws', { // Try to create websockets when elements are processed case 'htmx:beforeProcessNode': - forEach(queryAttributeOnThisOrChildren(parent, 'ws-connect'), (child) => { - ensureWebSocket(child); - }); - forEach(queryAttributeOnThisOrChildren(parent, 'ws-send'), (child) => { - ensureWebSocketSend(child); - }); + if(parent.hasAttribute("ws-connect")) { + ensureWebSocket(parent as HTMLElement); + } + + if(parent.hasAttribute("ws-send")) { + ensureWebSocketSend(parent as HTMLElement); + } } }, }); diff --git a/framework/h/lifecycle.go b/framework/h/lifecycle.go index a3cd604..5d572aa 100644 --- a/framework/h/lifecycle.go +++ b/framework/h/lifecycle.go @@ -86,6 +86,34 @@ func OnEvent(event hx.Event, cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(event, cmd...) } +func HxBeforeWsMessage(cmd ...Command) *LifeCycle { + return NewLifeCycle().OnEvent(hx.WsBeforeMessageEvent, cmd...) +} + +func HxAfterWsMessage(cmd ...Command) *LifeCycle { + return NewLifeCycle().OnEvent(hx.WsAfterMessageEvent, cmd...) +} + +func OnSubmit(cmd ...Command) *LifeCycle { + return NewLifeCycle().OnEvent(hx.SubmitEvent, cmd...) +} + +func HxOnWsError(cmd ...Command) *LifeCycle { + return NewLifeCycle().OnEvent(hx.WsErrorEvent, cmd...) +} + +func HxOnWsClose(cmd ...Command) *LifeCycle { + return NewLifeCycle().OnEvent(hx.WsClosedEvent, cmd...) +} + +func HxOnWsConnecting(cmd ...Command) *LifeCycle { + return NewLifeCycle().OnEvent(hx.WsConnectingEvent, cmd...) +} + +func HxOnWsOpen(cmd ...Command) *LifeCycle { + return NewLifeCycle().OnEvent(hx.WsConnectedEvent, cmd...) +} + func HxBeforeWsSend(cmd ...Command) *LifeCycle { return NewLifeCycle().HxBeforeWsSend(cmd...) } @@ -279,6 +307,16 @@ func EvalJs(js string) ComplexJsCommand { return NewComplexJsCommand(js) } +func PreventDefault() SimpleJsCommand { + // language=JavaScript + return SimpleJsCommand{Command: "event.preventDefault()"} +} + +func ConsoleLog(text string) SimpleJsCommand { + // language=JavaScript + return SimpleJsCommand{Command: fmt.Sprintf("console.log('%s')", text)} +} + func SetValue(value string) SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: fmt.Sprintf("this.value = '%s'", value)} @@ -288,7 +326,10 @@ func SubmitFormOnEnter() ComplexJsCommand { // language=JavaScript return EvalJs(` if (event.code === 'Enter') { - self.form.dispatchEvent(new Event('submit', { cancelable: true })); + console.log('submitting form'); + setTimeout(() => { + self.form.dispatchEvent(new Event('submit', { cancelable: true })); + }, 250) } `) } diff --git a/framework/h/renderer.go b/framework/h/renderer.go index f0fd913..83efa4f 100644 --- a/framework/h/renderer.go +++ b/framework/h/renderer.go @@ -43,7 +43,8 @@ type RenderContext struct { func (ctx *RenderContext) AddScript(funcName string, body string) { script := fmt.Sprintf(` `, funcName, funcName, body) @@ -223,10 +224,10 @@ func (l *LifeCycle) Render(context *RenderContext) { for _, command := range commands { switch c := command.(type) { case SimpleJsCommand: - m[event] += fmt.Sprintf("%s;", c.Command) + m[event] += fmt.Sprintf("var self=this;var e=event;%s;", c.Command) case ComplexJsCommand: context.AddScript(c.TempFuncName, c.Command) - m[event] += fmt.Sprintf("%s(this);", c.TempFuncName) + m[event] += fmt.Sprintf("%s(this, event);", c.TempFuncName) case *AttributeMapOrdered: c.Each(func(key string, value string) { l.fromAttributeMap(event, key, value, context) diff --git a/framework/hx/htmx.go b/framework/hx/htmx.go index bedba53..7fc2c13 100644 --- a/framework/hx/htmx.go +++ b/framework/hx/htmx.go @@ -110,6 +110,12 @@ const ( XhrProgressEvent Event = "htmx:xhr:progress" BeforeWsSendEvent Event = "htmx:wsBeforeSend" AfterWsSendEvent Event = "htmx:wsAfterSend" + WsConnectedEvent Event = "htmx:wsOpen" + WsConnectingEvent Event = "htmx:wsConnecting" + WsClosedEvent Event = "htmx:wsClose" + WsErrorEvent Event = "htmx:wsError" + WsBeforeMessageEvent Event = "htmx:wsBeforeMessage" + WsAfterMessageEvent Event = "htmx:wsAfterMessage" // RevealedEvent Misc Events RevealedEvent Event = "revealed" diff --git a/framework/js/commands.go b/framework/js/commands.go index 525227d..4cb69d8 100644 --- a/framework/js/commands.go +++ b/framework/js/commands.go @@ -21,7 +21,9 @@ var EvalJsOnParent = h.EvalJsOnParent var SetClassOnSibling = h.SetClassOnSibling var RemoveClassOnSibling = h.RemoveClassOnSibling var Remove = h.Remove +var PreventDefault = h.PreventDefault var EvalJs = h.EvalJs +var ConsoleLog = h.ConsoleLog var SetValue = h.SetValue var SubmitFormOnEnter = h.SubmitFormOnEnter var InjectScript = h.InjectScript diff --git a/htmgo-site/md/docs/4_interactivity/2_events.md b/htmgo-site/md/docs/4_interactivity/2_events.md index 534f841..40664b5 100644 --- a/htmgo-site/md/docs/4_interactivity/2_events.md +++ b/htmgo-site/md/docs/4_interactivity/2_events.md @@ -42,6 +42,8 @@ OnClick(cmd ...Command) *LifeCycle HxOnAfterSwap(cmd ...Command) *LifeCycle HxOnLoad(cmd ...Command) *LifeCycle ``` +**Note:** Each command you attach to the event handler will be passed 'self' and 'event' (if applicable) as arguments. +'self' is the current element, and 'event' is the event object. If you use the OnEvent directly, event names may be any [HTML DOM](https://www.w3schools.com/jsref/dom_obj_event.asp) events, or any [HTMX events](https://htmx.org/events/). From 8abed86b7d20b28a6d344a714e71bc4352ad769a Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 12:42:01 -0500 Subject: [PATCH 08/28] some styling and validation --- examples/chat/chat/component.go | 17 +++++---- examples/chat/pages/chat.$id.go | 62 +++++++++++++++++++++++---------- examples/chat/pages/index.go | 12 +++++++ examples/chat/partials/index.go | 9 +++++ examples/chat/ws/handler.go | 3 ++ examples/chat/ws/manager.go | 2 -- 6 files changed, 77 insertions(+), 28 deletions(-) diff --git a/examples/chat/chat/component.go b/examples/chat/chat/component.go index ab445eb..38ff752 100644 --- a/examples/chat/chat/component.go +++ b/examples/chat/chat/component.go @@ -10,13 +10,16 @@ import ( func MessageRow(message *Message) *h.Element { return h.Div( h.Attribute("hx-swap-oob", "beforeend"), - h.Class("flex flex-col gap-2 w-full"), + h.Class("flex flex-col gap-4 w-full"), h.Id("messages"), h.Div( - h.Class("flex gap-2 items-center"), - h.Pf(message.UserName), - h.Pf(message.CreatedAt.In(time.Local).Format("01/02 03:04 PM")), - h.Pf(message.Message), + h.Class("flex flex-col gap-1"), + h.Div( + h.Class("flex gap-2 items-center"), + h.Pf(message.UserName, h.Class("font-bold")), + h.Pf(message.CreatedAt.In(time.Local).Format("01/02 03:04 PM")), + ), + h.P(h.Text(message.Message)), ), ) } @@ -26,7 +29,7 @@ func ConnectedUsers(username string) *h.Element { h.Attribute("hx-swap", "none"), h.Attribute("hx-swap-oob", "beforeend"), h.Id("connected-users"), - h.Class("flex flex-col gap-2"), + h.Class("flex flex-col"), // This would be populated dynamically with connected users ConnectedUser(username, false), ) @@ -39,7 +42,7 @@ func ConnectedUser(username string, remove bool) *h.Element { } return h.Li( h.Id(id), - h.Class("text-slate-700"), + h.Class("truncate text-slate-700"), h.Text(username), ) } diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 0d2ebca..44dc48f 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -6,6 +6,7 @@ import ( "github.com/go-chi/chi/v5" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/js" + "time" ) func ChatRoom(ctx *h.RequestContext) *h.Page { @@ -29,8 +30,10 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { const reason = e.detail.event.reason if(['invalid room', 'no session'].includes(reason)) { window.location.href = '/'; + } else if(e.detail.event.code === 1011) { + window.location.reload() } else { - console.error('Connection closed:', e.detail.event) + console.error('Connection closed:', e.detail.event) } `), ), @@ -40,26 +43,30 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { // Sidebar for connected users UserSidebar(), - // Chat Area h.Div( - h.Class("flex flex-col flex-grow gap-4 bg-white rounded p-4"), + h.Class("flex flex-col flex-grow bg-white rounded p-4"), + + // Room name at the top, fixed + CachedRoomHeader(ctx), + + // Padding to push chat content below the fixed room name + h.Div(h.Class("pt-[50px]")), h.HxAfterWsMessage( js.EvalJsOnSibling("#messages", - // language=JavaScript `element.scrollTop = element.scrollHeight;`), ), // Chat Messages h.Div( h.Id("messages"), - h.Class("flex flex-col gap-2 overflow-auto grow w-full"), + h.Class("flex flex-col gap-4 overflow-auto grow w-full"), ), // Chat Input at the bottom h.Div( h.Class("mt-auto"), - Form(ctx), + Form(), ), ), ), @@ -67,11 +74,35 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { ) } +var CachedRoomHeader = h.CachedT(time.Hour, func(ctx *h.RequestContext) *h.Element { + return roomNameHeader(ctx) +}) + +func roomNameHeader(ctx *h.RequestContext) *h.Element { + roomId := chi.URLParam(ctx.Request, "id") + service := chat.NewService(ctx.ServiceLocator()) + room, err := service.GetRoom(roomId) + if err != nil { + return h.Div() + } + return h.Div( + h.Class("bg-neutral-700 text-white p-3 shadow-sm w-full fixed top-0 left-0 flex justify-center z-10"), + h.H2F(room.Name, h.Class("text-lg font-bold")), + ) +} + func UserSidebar() *h.Element { return h.Div( - h.Class("w-48 bg-slate-200 p-4 flex flex-col gap-3 rounded-l-lg"), - h.H2F("Connected Users", h.Class("text-lg font-bold")), - chat.ConnectedUsers(""), + h.Class("pt-[67px] min-w-48 w-48 bg-neutral-200 p-4 flex flex-col justify-between gap-3 rounded-l-lg"), + h.Div( + h.H3F("Connected Users", h.Class("text-lg font-bold")), + chat.ConnectedUsers(""), + ), + h.A( + h.Class("cursor-pointer"), + h.Href("/"), + h.Text("Leave Room"), + ), ) } @@ -79,8 +110,9 @@ func MessageInput() *h.Element { return h.Input("text", h.Id("message-input"), h.Required(), - h.Class("p-4 rounded-md border border-slate-200 w-full"), + h.Class("p-4 rounded-md border border-slate-200 w-full focus:outline-none focus:ring focus:ring-slate-200"), h.Name("message"), + h.MaxLength(1000), h.Placeholder("Type a message..."), h.HxAfterWsSend( js.SetValue(""), @@ -88,7 +120,7 @@ func MessageInput() *h.Element { ) } -func Form(ctx *h.RequestContext) *h.Element { +func Form() *h.Element { return h.Div( h.Class("flex gap-4 items-center"), h.Form( @@ -98,11 +130,3 @@ func Form(ctx *h.RequestContext) *h.Element { ), ) } - -func Spinner(children ...h.Ren) *h.Element { - return h.Div( - h.Children(children...), - h.Class("spinner spinner-border animate-spin w-4 h-4 border-2 border-t-transparent"), - h.Attribute("role", "status"), - ) -} diff --git a/examples/chat/pages/index.go b/examples/chat/pages/index.go index c077f08..62befcb 100644 --- a/examples/chat/pages/index.go +++ b/examples/chat/pages/index.go @@ -24,6 +24,10 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { Name: "username", Label: "Username", Required: true, + Children: []h.Ren{ + h.Attribute("autocomplete", "off"), + h.MaxLength(15), + }, }), h.Div( @@ -33,6 +37,10 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { Name: "new-chat-room", Label: "Create a New Chat Room", Placeholder: "Chat Room Name", + Children: []h.Ren{ + h.Attribute("autocomplete", "off"), + h.MaxLength(20), + }, }), h.Div( @@ -47,6 +55,10 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { Name: "join-chat-room", Label: "Join a Chat Room", Placeholder: "Chat Room Id", + Children: []h.Ren{ + h.Attribute("autocomplete", "off"), + h.MaxLength(100), + }, }), ), diff --git a/examples/chat/partials/index.go b/examples/chat/partials/index.go index ae86ea8..d38daec 100644 --- a/examples/chat/partials/index.go +++ b/examples/chat/partials/index.go @@ -19,6 +19,10 @@ func CreateOrJoinRoom(ctx *h.RequestContext) *h.Partial { return h.SwapPartial(ctx, components.FormError("Username is required")) } + if len(username) > 15 { + return h.SwapPartial(ctx, components.FormError("Username is too long")) + } + user, err := service.CreateUser(username) if err != nil { @@ -52,6 +56,11 @@ func CreateOrJoinRoom(ctx *h.RequestContext) *h.Partial { } chatRoomName := ctx.Request.FormValue("new-chat-room") + + if len(chatRoomName) > 20 { + return h.SwapPartial(ctx, components.FormError("Chat room name is too long")) + } + if chatRoomName != "" { room, _ := service.CreateRoom(chatRoomName) if room == nil { diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go index 5281dea..dc0a79a 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/ws/handler.go @@ -19,6 +19,9 @@ func Handle() http.HandlerFunc { c, err := websocket.Accept(w, r, nil) + // 2 mb + c.SetReadLimit(2 * 1024 * 1024) + if err != nil { return } diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index 06bdbd7..fddea04 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -2,7 +2,6 @@ package ws import ( "context" - "fmt" "github.com/coder/websocket" "github.com/puzpuzpuz/xsync/v3" ) @@ -142,7 +141,6 @@ func (manager *SocketManager) Broadcast(message []byte, messageType websocket.Me } func (manager *SocketManager) BroadcastText(message string) { - fmt.Printf("Broadcasting message: \n%s\n", message) manager.Broadcast([]byte(message), websocket.MessageText) } From f4f64fefcc75dabf86536fdddc125e84b63ba2df Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 12:56:16 -0500 Subject: [PATCH 09/28] some styling --- examples/chat/components/input.go | 1 + examples/chat/pages/chat.$id.go | 15 ++++++++++++--- examples/chat/pages/index.go | 25 +++++++++++++++++-------- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/examples/chat/components/input.go b/examples/chat/components/input.go index eadad94..fec1363 100644 --- a/examples/chat/components/input.go +++ b/examples/chat/components/input.go @@ -35,6 +35,7 @@ func Input(props InputProps) *h.Element { h.If(props.Name != "", h.Name(props.Name)), h.If(props.Children != nil, h.Children(props.Children...)), h.If(props.Required, h.Required()), + h.If(props.Placeholder != "", h.Placeholder(props.Placeholder)), h.If(props.DefaultValue != "", h.Attribute("value", props.DefaultValue)), validation, ) diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 44dc48f..6668c17 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -26,16 +26,16 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { ), h.HxOnWsClose( - js.EvalJs(` + js.EvalJs(fmt.Sprintf(` const reason = e.detail.event.reason if(['invalid room', 'no session'].includes(reason)) { - window.location.href = '/'; + window.location.href = '/?roomId=%s'; } else if(e.detail.event.code === 1011) { window.location.reload() } else { console.error('Connection closed:', e.detail.event) } - `), + `, roomId)), ), h.Class("flex flex-row min-h-screen bg-neutral-100"), @@ -88,6 +88,15 @@ func roomNameHeader(ctx *h.RequestContext) *h.Element { return h.Div( h.Class("bg-neutral-700 text-white p-3 shadow-sm w-full fixed top-0 left-0 flex justify-center z-10"), h.H2F(room.Name, h.Class("text-lg font-bold")), + h.Div( + h.Class("absolute right-5 top-3 cursor-pointer"), + h.Text("Share"), + h.OnClick( + js.EvalJs(` + alert("Share this url with your friends:\n " + window.location.href) + `), + ), + ), ) } diff --git a/examples/chat/pages/index.go b/examples/chat/pages/index.go index 62befcb..571d5b5 100644 --- a/examples/chat/pages/index.go +++ b/examples/chat/pages/index.go @@ -17,8 +17,9 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { h.Form( h.Attribute("hx-swap", "none"), h.PostPartial(partials.CreateOrJoinRoom), - h.Class("flex flex-col gap-3"), + h.Class("flex flex-col gap-6"), + // Username input at the top components.Input(components.InputProps{ Id: "username", Name: "username", @@ -30,19 +31,22 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { }, }), + // Single box for Create or Join a Chat Room h.Div( - h.Class("mt-6 flex flex-col gap-3"), + h.Class("p-4 border border-gray-300 rounded-md flex flex-col gap-6"), + // Create New Chat Room input components.Input(components.InputProps{ Name: "new-chat-room", - Label: "Create a New Chat Room", - Placeholder: "Chat Room Name", + Label: "Create a new chat room", + Placeholder: "Enter chat room name", Children: []h.Ren{ h.Attribute("autocomplete", "off"), h.MaxLength(20), }, }), + // OR divider h.Div( h.Class("flex items-center justify-center gap-4"), h.Div(h.Class("border-t border-gray-300 flex-grow")), @@ -50,11 +54,13 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { h.Div(h.Class("border-t border-gray-300 flex-grow")), ), + // Join Chat Room input components.Input(components.InputProps{ - Id: "join-chat-room", - Name: "join-chat-room", - Label: "Join a Chat Room", - Placeholder: "Chat Room Id", + Id: "join-chat-room", + Name: "join-chat-room", + Label: "Join an existing chat room", + Placeholder: "Enter chat room ID", + DefaultValue: ctx.QueryParam("roomId"), Children: []h.Ren{ h.Attribute("autocomplete", "off"), h.MaxLength(100), @@ -62,7 +68,10 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { }), ), + // Error message components.FormError(""), + + // Submit button at the bottom components.PrimaryButton(components.ButtonProps{ Type: "submit", Text: "Submit", From 25f12aa49ee8ff43116c62f94f0f342347d225ed Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 13:42:14 -0500 Subject: [PATCH 10/28] some fixes --- examples/chat/Dockerfile | 12 +++----- examples/chat/chat/broadcast.go | 38 +++++++++++++++++------ examples/chat/chat/component.go | 10 +++--- examples/chat/pages/chat.$id.go | 8 +++-- examples/chat/ws/handler.go | 1 - examples/chat/ws/manager.go | 54 +++++++++++++++++++++++---------- 6 files changed, 82 insertions(+), 41 deletions(-) diff --git a/examples/chat/Dockerfile b/examples/chat/Dockerfile index 7bed324..a738a1b 100644 --- a/examples/chat/Dockerfile +++ b/examples/chat/Dockerfile @@ -1,9 +1,5 @@ # Stage 1: Build the Go binary -FROM golang:1.23-alpine AS builder - -RUN apk update -RUN apk add git -RUN apk add curl +FROM golang:1.23 AS builder # Set the working directory inside the container WORKDIR /app @@ -18,7 +14,9 @@ RUN go mod download COPY . . # Build the Go binary for Linux -RUN GOPRIVATE=github.com/maddalax GOPROXY=direct go run github.com/maddalax/htmgo/cli/htmgo@latest build +RUN CGO_ENABLED=0 GOPRIVATE=github.com/maddalax LOG_LEVEL=debug go run github.com/maddalax/htmgo/cli/htmgo@latest build + +RUN CGO_ENABLED=1 GOOS=linux go build -o ./dist -a -ldflags '-linkmode external -extldflags "-static"' . # Stage 2: Create the smallest possible image @@ -35,4 +33,4 @@ EXPOSE 3000 # Command to run the binary -CMD ["./starter-template"] \ No newline at end of file +CMD ["./chat"] diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 7c9e2a7..690ce5c 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -52,36 +52,51 @@ func (m *Manager) OnConnected(e ws.SocketEvent) { return } - fmt.Printf("User %s connected to room %s\n", e.Id, e.RoomId) - user, err := m.queries.GetUserBySessionId(context.Background(), e.Id) if err != nil { + m.socketManager.CloseWithError(e.Id, websocket.StatusPolicyViolation, "invalid user") return } - m.socketManager.BroadcastText(h.Render(ConnectedUsers(user.Name))) + fmt.Printf("User %s connected to %s\n", user.Name, e.RoomId) + + // backfill all existing clients to the connected client m.socketManager.ForEachSocket(e.RoomId, func(conn ws.SocketConnection) { - if conn.Id == e.Id { - return - } user, err := m.queries.GetUserBySessionId(context.Background(), conn.Id) if err != nil { return } - m.socketManager.SendText(e.Id, h.Render(ConnectedUsers(user.Name))) + isMe := conn.Id == e.Id + fmt.Printf("Sending connected user %s to %s\n", user.Name, e.Id) + m.socketManager.SendText(e.Id, h.Render(ConnectedUsers(user.Name, isMe))) }) + // send the connected user to all existing clients + m.socketManager.BroadcastText( + e.RoomId, + h.Render(ConnectedUsers(user.Name, false)), + func(conn ws.SocketConnection) bool { + return conn.Id != e.Id + }, + ) + go m.backFill(e.Id, e.RoomId) } func (m *Manager) OnDisconnected(e ws.SocketEvent) { - fmt.Printf("User %s disconnected\n", e.Id) user, err := m.queries.GetUserBySessionId(context.Background(), e.Id) if err != nil { return } - m.socketManager.BroadcastText(h.Render(ConnectedUser(user.Name, true))) + room, err := m.service.GetRoom(e.RoomId) + if err != nil { + return + } + fmt.Printf("User %s disconnected from %s\n", user.Name, room.ID) + m.socketManager.BroadcastText(room.ID, h.Render(ConnectedUser(user.Name, true, false)), func(conn ws.SocketConnection) bool { + return conn.Id != e.Id + }) } func (m *Manager) backFill(socketId string, roomId string) { @@ -103,7 +118,6 @@ func (m *Manager) backFill(socketId string, roomId string) { } func (m *Manager) onMessage(e ws.SocketEvent) { - fmt.Printf("Received message from %s: %v\n", e.Id, e.Payload) message := e.Payload["message"].(string) if message == "" { @@ -125,7 +139,11 @@ func (m *Manager) onMessage(e ws.SocketEvent) { if saved != nil { m.socketManager.BroadcastText( + e.RoomId, h.Render(MessageRow(saved)), + func(conn ws.SocketConnection) bool { + return true + }, ) } } diff --git a/examples/chat/chat/component.go b/examples/chat/chat/component.go index 38ff752..7f88ad2 100644 --- a/examples/chat/chat/component.go +++ b/examples/chat/chat/component.go @@ -24,25 +24,27 @@ func MessageRow(message *Message) *h.Element { ) } -func ConnectedUsers(username string) *h.Element { +func ConnectedUsers(username string, isMe bool) *h.Element { return h.Ul( h.Attribute("hx-swap", "none"), h.Attribute("hx-swap-oob", "beforeend"), h.Id("connected-users"), h.Class("flex flex-col"), // This would be populated dynamically with connected users - ConnectedUser(username, false), + ConnectedUser(username, false, isMe), ) } -func ConnectedUser(username string, remove bool) *h.Element { +func ConnectedUser(username string, remove bool, isMe bool) *h.Element { id := fmt.Sprintf("connected-user-%s", strings.ReplaceAll(username, "#", "-")) if remove { return h.Div(h.Id(id), h.Attribute("hx-swap-oob", "delete")) } return h.Li( h.Id(id), - h.Class("truncate text-slate-700"), + h.ClassX("truncate text-slate-700", h.ClassMap{ + "font-bold": isMe, + }), h.Text(username), ) } diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 6668c17..f38baab 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -28,14 +28,16 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { h.HxOnWsClose( js.EvalJs(fmt.Sprintf(` const reason = e.detail.event.reason - if(['invalid room', 'no session'].includes(reason)) { + if(['invalid room', 'no session', 'invalid user'].includes(reason)) { window.location.href = '/?roomId=%s'; } else if(e.detail.event.code === 1011) { window.location.reload() + } else if (e.detail.event.code === 1008 || e.detail.event.code === 1006) { + window.location.href = '/?roomId=%s'; } else { console.error('Connection closed:', e.detail.event) } - `, roomId)), + `, roomId, roomId)), ), h.Class("flex flex-row min-h-screen bg-neutral-100"), @@ -105,7 +107,7 @@ func UserSidebar() *h.Element { h.Class("pt-[67px] min-w-48 w-48 bg-neutral-200 p-4 flex flex-col justify-between gap-3 rounded-l-lg"), h.Div( h.H3F("Connected Users", h.Class("text-lg font-bold")), - chat.ConnectedUsers(""), + chat.ConnectedUsers("", false), ), h.A( h.Class("cursor-pointer"), diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go index dc0a79a..b4bc9bb 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/ws/handler.go @@ -55,7 +55,6 @@ func Handle() http.HandlerFunc { var v map[string]any err = wsjson.Read(context.Background(), c, &v) if err != nil { - slog.Error("failed to read message", slog.String("room_id", roomId)) manager.CloseWithError(sessionId, websocket.StatusInternalError, "failed to read message") return } diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index fddea04..1c03baa 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -28,21 +28,25 @@ type SocketConnection struct { } type SocketManager struct { - sockets *xsync.MapOf[string, SocketConnection] + sockets *xsync.MapOf[string, *xsync.MapOf[string, SocketConnection]] + idToRoom *xsync.MapOf[string, string] listeners []chan SocketEvent } func NewSocketManager() *SocketManager { return &SocketManager{ - sockets: xsync.NewMapOf[string, SocketConnection](), + sockets: xsync.NewMapOf[string, *xsync.MapOf[string, SocketConnection]](), + idToRoom: xsync.NewMapOf[string, string](), } } func (manager *SocketManager) ForEachSocket(roomId string, cb func(conn SocketConnection)) { - manager.sockets.Range(func(id string, conn SocketConnection) bool { - if conn.RoomId == roomId { - cb(conn) - } + sockets, ok := manager.sockets.Load(roomId) + if !ok { + return + } + sockets.Range(func(id string, conn SocketConnection) bool { + cb(conn) return true }) } @@ -74,15 +78,23 @@ func (manager *SocketManager) OnMessage(id string, message map[string]any) { } func (manager *SocketManager) Add(roomId string, id string, conn *websocket.Conn) { - manager.sockets.Store(id, SocketConnection{ + manager.idToRoom.Store(id, roomId) + + sockets, ok := manager.sockets.LoadOrCompute(roomId, func() *xsync.MapOf[string, SocketConnection] { + return xsync.NewMapOf[string, SocketConnection]() + }) + + sockets.Store(id, SocketConnection{ Id: id, Conn: conn, RoomId: roomId, }) - s, ok := manager.sockets.Load(id) + + s, ok := sockets.Load(id) if !ok { return } + manager.dispatch(SocketEvent{ Id: s.Id, Type: ConnectedEvent, @@ -122,26 +134,36 @@ func (manager *SocketManager) Disconnect(id string) { } func (manager *SocketManager) Get(id string) *SocketConnection { - conn, ok := manager.sockets.Load(id) + roomId, ok := manager.idToRoom.Load(id) if !ok { return nil } + sockets, ok := manager.sockets.Load(roomId) + if !ok { + return nil + } + conn, ok := sockets.Load(id) return &conn } -func (manager *SocketManager) Broadcast(message []byte, messageType websocket.MessageType) { +func (manager *SocketManager) Broadcast(roomId string, message []byte, messageType websocket.MessageType, predicate func(conn SocketConnection) bool) { ctx := context.Background() - manager.sockets.Range(func(id string, conn SocketConnection) bool { - err := conn.Conn.Write(ctx, messageType, message) - if err != nil { - manager.Disconnect(id) + sockets, ok := manager.sockets.Load(roomId) + + if !ok { + return + } + + sockets.Range(func(id string, conn SocketConnection) bool { + if predicate(conn) { + conn.Conn.Write(ctx, messageType, message) } return true }) } -func (manager *SocketManager) BroadcastText(message string) { - manager.Broadcast([]byte(message), websocket.MessageText) +func (manager *SocketManager) BroadcastText(roomId string, message string, predicate func(conn SocketConnection) bool) { + manager.Broadcast(roomId, []byte(message), websocket.MessageText, predicate) } func (manager *SocketManager) SendText(id string, message string) { From 48946810be26e1ba74d788ae0481cdefa1ace600 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 13:43:05 -0500 Subject: [PATCH 11/28] add gh --- .github/workflows/release-chat-example.yml | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 .github/workflows/release-chat-example.yml diff --git a/.github/workflows/release-chat-example.yml b/.github/workflows/release-chat-example.yml new file mode 100644 index 0000000..a91f4d0 --- /dev/null +++ b/.github/workflows/release-chat-example.yml @@ -0,0 +1,46 @@ +name: Build and Deploy htmgo.dev chat example + +on: + workflow_dispatch: # Trigger on manual workflow_dispatch + push: + branches: + - master # Trigger on pushes to master + paths: + - 'examples/chat/**' # Trigger only if files in this directory change + +jobs: + build-and-push: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Get short commit hash + id: vars + run: echo "::set-output name=short_sha::$(echo $GITHUB_SHA | cut -c1-7)" + + - name: Build Docker image + run: | + cd ./examples/chat && docker build -t ghcr.io/${{ github.repository_owner }}/htmgo-chat-example:${{ steps.vars.outputs.short_sha }} . + + - name: Tag as latest Docker image + run: | + docker tag ghcr.io/${{ github.repository_owner }}/htmgo-chat-example:${{ steps.vars.outputs.short_sha }} ghcr.io/${{ github.repository_owner }}/htmgo-chat-example:latest + + - name: Log in to GitHub Container Registry + run: echo "${{ secrets.CR_PAT }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin + + - name: Push Docker image + run: | + docker push ghcr.io/${{ github.repository_owner }}/htmgo-chat-example:latest From 9a5b929877017f0b6705d819e85001e6e2627dbf Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 13:45:32 -0500 Subject: [PATCH 12/28] add gh --- .github/workflows/release-chat-example.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release-chat-example.yml b/.github/workflows/release-chat-example.yml index a91f4d0..0302bd9 100644 --- a/.github/workflows/release-chat-example.yml +++ b/.github/workflows/release-chat-example.yml @@ -1,6 +1,9 @@ name: Build and Deploy htmgo.dev chat example on: + pull_request: + branches: + - master workflow_dispatch: # Trigger on manual workflow_dispatch push: branches: From 5089dea7a12028c35fb246a8c87998ed6be2d36b Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 13:52:26 -0500 Subject: [PATCH 13/28] fix build --- examples/chat/Dockerfile | 2 +- examples/chat/go.mod | 12 ++++++------ examples/chat/go.sum | 6 ++++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/examples/chat/Dockerfile b/examples/chat/Dockerfile index a738a1b..72c37a4 100644 --- a/examples/chat/Dockerfile +++ b/examples/chat/Dockerfile @@ -14,7 +14,7 @@ RUN go mod download COPY . . # Build the Go binary for Linux -RUN CGO_ENABLED=0 GOPRIVATE=github.com/maddalax LOG_LEVEL=debug go run github.com/maddalax/htmgo/cli/htmgo@latest build +RUN CGO_ENABLED=0 GOPRIVATE=github.com/maddalax LOG_LEVEL=debug go run github.com/maddalax/htmgo/cli/htmgo@9a5b929877017f0b6705d819e85001e6e2627dbf build RUN CGO_ENABLED=1 GOOS=linux go build -o ./dist -a -ldflags '-linkmode external -extldflags "-static"' . diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 8b66448..17324de 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -2,11 +2,11 @@ module chat go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20240930141756-0fa096ea2f12 - require ( - github.com/coder/websocket v1.8.12 // indirect - github.com/go-chi/chi/v5 v5.1.0 // indirect - github.com/google/uuid v1.6.0 // indirect - github.com/puzpuzpuz/xsync/v3 v3.4.0 // indirect + github.com/coder/websocket v1.8.12 + github.com/go-chi/chi/v5 v5.1.0 + github.com/google/uuid v1.6.0 + github.com/maddalax/htmgo/framework v0.0.0-20241001184532-9a5b92987701 + github.com/mattn/go-sqlite3 v1.14.23 + github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 70491aa..a2ec01f 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -6,8 +6,10 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20240930141756-0fa096ea2f12 h1:UKmSB4aTk7+FS8j2pz7ytFQQI0ihqZznG9PLqUM+2QM= -github.com/maddalax/htmgo/framework v0.0.0-20240930141756-0fa096ea2f12/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241001184532-9a5b92987701 h1:0Zk282axc1kPiuspLNzK5BJV7cQ5h2kPZHe54dznhYY= +github.com/maddalax/htmgo/framework v0.0.0-20241001184532-9a5b92987701/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= +github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/puzpuzpuz/xsync/v3 v3.4.0 h1:DuVBAdXuGFHv8adVXjWWZ63pJq+NRXOWVXlKDBZ+mJ4= From d37bbd85a5b93567cb48abc047b4c520c618e4a5 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 14:02:32 -0500 Subject: [PATCH 14/28] cache fix --- examples/chat/pages/chat.$id.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index f38baab..70e7fd4 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -76,8 +76,11 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { ) } -var CachedRoomHeader = h.CachedT(time.Hour, func(ctx *h.RequestContext) *h.Element { - return roomNameHeader(ctx) +var CachedRoomHeader = h.CachedPerKeyT(time.Hour, func(ctx *h.RequestContext) (string, h.GetElementFunc) { + roomId := chi.URLParam(ctx.Request, "id") + return roomId, func() *h.Element { + return roomNameHeader(ctx) + } }) func roomNameHeader(ctx *h.RequestContext) *h.Element { From 5b10aed601e8c3d8bd7820876920705f4d31b07f Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 17:19:38 -0500 Subject: [PATCH 15/28] cleanup --- examples/chat/partials/index.go | 7 +++---- framework/h/base.go | 12 ++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/examples/chat/partials/index.go b/examples/chat/partials/index.go index d38daec..4607475 100644 --- a/examples/chat/partials/index.go +++ b/examples/chat/partials/index.go @@ -36,13 +36,12 @@ func CreateOrJoinRoom(ctx *h.RequestContext) *h.Partial { Path: "/", Expires: time.Now().Add(24 * 30 * time.Hour), } - return h.SwapManyPartialWithHeaders( - ctx, + + return h.RedirectPartialWithHeaders( + path, h.NewHeaders( "Set-Cookie", cookie.String(), - "HX-Redirect", path, ), - h.Fragment(), ) } diff --git a/framework/h/base.go b/framework/h/base.go index 01ecd76..027e013 100644 --- a/framework/h/base.go +++ b/framework/h/base.go @@ -51,6 +51,18 @@ func SwapManyPartialWithHeaders(ctx *RequestContext, headers *Headers, swaps ... ) } +func RedirectPartial(path string) *Partial { + return RedirectPartialWithHeaders(path, NewHeaders()) +} + +func RedirectPartialWithHeaders(path string, headers *Headers) *Partial { + h := *NewHeaders("HX-Redirect", path) + for k, v := range *headers { + h[k] = v + } + return NewPartialWithHeaders(&h, Fragment()) +} + func SwapPartial(ctx *RequestContext, swap *Element) *Partial { return NewPartial( SwapMany(ctx, swap)) From 8b816e956692683337d9fff6416ccc31f5047b59 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 22:26:03 -0500 Subject: [PATCH 16/28] switch to sse --- cli/htmgo/tasks/reloader/reloader.go | 7 + cli/htmgo/watcher.go | 12 + examples/chat/assets.go | 13 + examples/chat/assets_prod.go | 16 + examples/chat/chat/broadcast.go | 5 +- examples/chat/chat/component.go | 7 +- examples/chat/internal/embedded/os.go | 17 + examples/chat/main.go | 6 +- examples/chat/pages/chat.$id.go | 15 +- examples/chat/partials/chat.go | 35 ++ examples/chat/ws/handler.go | 56 +-- examples/chat/ws/manager.go | 65 +++- framework/assets/dist/htmgo.js | 4 +- framework/assets/js/htmgo.ts | 2 +- framework/assets/js/htmxextensions/sse.ts | 64 ++++ framework/assets/js/htmxextensions/ws.ts | 418 ---------------------- framework/h/attribute.go | 4 + framework/h/base.go | 4 + framework/h/extensions.go | 2 +- framework/h/lifecycle.go | 42 +-- framework/h/xhr.go | 15 +- framework/hx/htmx.go | 14 +- 22 files changed, 306 insertions(+), 517 deletions(-) create mode 100644 examples/chat/assets.go create mode 100644 examples/chat/assets_prod.go create mode 100644 examples/chat/internal/embedded/os.go create mode 100644 examples/chat/partials/chat.go create mode 100644 framework/assets/js/htmxextensions/sse.ts delete mode 100644 framework/assets/js/htmxextensions/ws.ts diff --git a/cli/htmgo/tasks/reloader/reloader.go b/cli/htmgo/tasks/reloader/reloader.go index fd5fddc..48fefc4 100644 --- a/cli/htmgo/tasks/reloader/reloader.go +++ b/cli/htmgo/tasks/reloader/reloader.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/fsnotify/fsnotify" "github.com/maddalax/htmgo/cli/htmgo/tasks/astgen" + "github.com/maddalax/htmgo/cli/htmgo/tasks/copyassets" "github.com/maddalax/htmgo/cli/htmgo/tasks/css" "github.com/maddalax/htmgo/cli/htmgo/tasks/run" "github.com/maddalax/htmgo/cli/htmgo/tasks/util" @@ -101,6 +102,12 @@ func OnFileChange(version string, events []*fsnotify.Event) { hasTask = true } + // framework assets changed + if c.HasAnySuffix("assets/dist/htmgo.js") { + copyassets.CopyAssets() + //tasks.Run = true + } + if hasTask { slog.Info("file changed", slog.String("version", version), slog.String("file", c.Name())) } diff --git a/cli/htmgo/watcher.go b/cli/htmgo/watcher.go index 6a1036f..f2a0ee8 100644 --- a/cli/htmgo/watcher.go +++ b/cli/htmgo/watcher.go @@ -4,10 +4,12 @@ import ( "github.com/fsnotify/fsnotify" "github.com/google/uuid" "github.com/maddalax/htmgo/cli/htmgo/internal" + "github.com/maddalax/htmgo/cli/htmgo/tasks/module" "log" "log/slog" "os" "path/filepath" + "strings" "time" ) @@ -36,6 +38,7 @@ func startWatcher(cb func(version string, file []*fsnotify.Event)) { if !ok { return } + slog.Debug("event:", slog.String("name", event.Name), slog.String("op", event.Op.String())) if event.Has(fsnotify.Write) || event.Has(fsnotify.Remove) || event.Has(fsnotify.Rename) { events = append(events, &event) debouncer.Do(func() { @@ -61,6 +64,15 @@ func startWatcher(cb func(version string, file []*fsnotify.Event)) { }() rootDir := "." + + frameworkPath := module.GetDependencyPath("github.com/maddalax/htmgo/framework") + + if !strings.HasPrefix(frameworkPath, "github.com/") { + assetPath := filepath.Join(frameworkPath, "assets", "dist") + slog.Debug("Watching directory:", slog.String("path", assetPath)) + watcher.Add(assetPath) + } + // Walk through the root directory and add all subdirectories to the watcher err = filepath.Walk(rootDir, func(path string, info os.FileInfo, err error) error { if err != nil { diff --git a/examples/chat/assets.go b/examples/chat/assets.go new file mode 100644 index 0000000..b4289b1 --- /dev/null +++ b/examples/chat/assets.go @@ -0,0 +1,13 @@ +//go:build !prod +// +build !prod + +package main + +import ( + "chat/internal/embedded" + "io/fs" +) + +func GetStaticAssets() fs.FS { + return embedded.NewOsFs() +} diff --git a/examples/chat/assets_prod.go b/examples/chat/assets_prod.go new file mode 100644 index 0000000..f0598e1 --- /dev/null +++ b/examples/chat/assets_prod.go @@ -0,0 +1,16 @@ +//go:build prod +// +build prod + +package main + +import ( + "embed" + "io/fs" +) + +//go:embed assets/dist/* +var staticAssets embed.FS + +func GetStaticAssets() fs.FS { + return staticAssets +} diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 690ce5c..312eb7b 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -5,7 +5,6 @@ import ( "chat/ws" "context" "fmt" - "github.com/coder/websocket" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" "time" @@ -48,14 +47,14 @@ func (m *Manager) OnConnected(e ws.SocketEvent) { room, _ := m.service.GetRoom(e.RoomId) if room == nil { - m.socketManager.CloseWithError(e.Id, websocket.StatusPolicyViolation, "invalid room") + m.socketManager.CloseWithError(e.Id, 1008, "invalid room") return } user, err := m.queries.GetUserBySessionId(context.Background(), e.Id) if err != nil { - m.socketManager.CloseWithError(e.Id, websocket.StatusPolicyViolation, "invalid user") + m.socketManager.CloseWithError(e.Id, 1008, "invalid user") return } diff --git a/examples/chat/chat/component.go b/examples/chat/chat/component.go index 7f88ad2..bf7c18d 100644 --- a/examples/chat/chat/component.go +++ b/examples/chat/chat/component.go @@ -10,7 +10,7 @@ import ( func MessageRow(message *Message) *h.Element { return h.Div( h.Attribute("hx-swap-oob", "beforeend"), - h.Class("flex flex-col gap-4 w-full"), + h.Class("flex flex-col gap-4 w-full break-words whitespace-normal"), // Ensure container breaks long words h.Id("messages"), h.Div( h.Class("flex flex-col gap-1"), @@ -19,7 +19,10 @@ func MessageRow(message *Message) *h.Element { h.Pf(message.UserName, h.Class("font-bold")), h.Pf(message.CreatedAt.In(time.Local).Format("01/02 03:04 PM")), ), - h.P(h.Text(message.Message)), + h.Article( + h.Class("break-words whitespace-normal"), // Ensure message text wraps correctly + h.P(h.Text(message.Message)), + ), ), ) } diff --git a/examples/chat/internal/embedded/os.go b/examples/chat/internal/embedded/os.go new file mode 100644 index 0000000..ddfd55f --- /dev/null +++ b/examples/chat/internal/embedded/os.go @@ -0,0 +1,17 @@ +package embedded + +import ( + "io/fs" + "os" +) + +type OsFs struct { +} + +func (receiver OsFs) Open(name string) (fs.File, error) { + return os.Open(name) +} + +func NewOsFs() OsFs { + return OsFs{} +} diff --git a/examples/chat/main.go b/examples/chat/main.go index 103077c..4cdff39 100644 --- a/examples/chat/main.go +++ b/examples/chat/main.go @@ -5,16 +5,12 @@ import ( "chat/chat" "chat/internal/db" "chat/ws" - "embed" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" "io/fs" "net/http" ) -//go:embed assets/dist/* -var StaticAssets embed.FS - func main() { locator := service.NewLocator() @@ -30,7 +26,7 @@ func main() { ServiceLocator: locator, LiveReload: true, Register: func(app *h.App) { - sub, err := fs.Sub(StaticAssets, "assets/dist") + sub, err := fs.Sub(GetStaticAssets(), "assets/dist") if err != nil { panic(err) diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 70e7fd4..4191e16 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -2,6 +2,7 @@ package pages import ( "chat/chat" + "chat/partials" "fmt" "github.com/go-chi/chi/v5" "github.com/maddalax/htmgo/framework/h" @@ -19,13 +20,13 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { h.HxExtension("ws"), ), - h.Attribute("ws-connect", fmt.Sprintf("/ws/chat/%s", roomId)), + h.Attribute("sse-connect", fmt.Sprintf("/ws/chat/%s", roomId)), - h.HxOnWsOpen( + h.HxOnSseOpen( js.ConsoleLog("Connected to chat room"), ), - h.HxOnWsClose( + h.HxOnSseClose( js.EvalJs(fmt.Sprintf(` const reason = e.detail.event.reason if(['invalid room', 'no session', 'invalid user'].includes(reason)) { @@ -54,7 +55,7 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { // Padding to push chat content below the fixed room name h.Div(h.Class("pt-[50px]")), - h.HxAfterWsMessage( + h.HxAfterSseMessage( js.EvalJsOnSibling("#messages", `element.scrollTop = element.scrollHeight;`), ), @@ -62,7 +63,7 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { // Chat Messages h.Div( h.Id("messages"), - h.Class("flex flex-col gap-4 overflow-auto grow w-full"), + h.Class("flex flex-col gap-4 overflow-auto grow w-full mb-4 max-w-[calc(100%-215px)]"), ), // Chat Input at the bottom @@ -128,7 +129,7 @@ func MessageInput() *h.Element { h.Name("message"), h.MaxLength(1000), h.Placeholder("Type a message..."), - h.HxAfterWsSend( + h.HxAfterSseMessage( js.SetValue(""), ), ) @@ -138,6 +139,8 @@ func Form() *h.Element { return h.Div( h.Class("flex gap-4 items-center"), h.Form( + h.NoSwap(), + h.PostPartial(partials.SendMessage), h.Attribute("ws-send", ""), h.Class("flex flex-grow"), MessageInput(), diff --git a/examples/chat/partials/chat.go b/examples/chat/partials/chat.go new file mode 100644 index 0000000..59b41cc --- /dev/null +++ b/examples/chat/partials/chat.go @@ -0,0 +1,35 @@ +package partials + +import ( + "chat/components" + "chat/ws" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" +) + +func SendMessage(ctx *h.RequestContext) *h.Partial { + locator := ctx.ServiceLocator() + socketManager := service.Get[ws.SocketManager](locator) + + sessionCookie, err := ctx.Request.Cookie("session_id") + + if err != nil { + return h.SwapPartial(ctx, components.FormError("Session not found")) + } + + message := ctx.Request.FormValue("message") + + if message == "" { + return h.SwapPartial(ctx, components.FormError("Message is required")) + } + + if len(message) > 200 { + return h.SwapPartial(ctx, components.FormError("Message is too long")) + } + + socketManager.OnMessage(sessionCookie.Value, map[string]any{ + "message": message, + }) + + return h.EmptyPartial() +} diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go index b4bc9bb..0f3ce68 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/ws/handler.go @@ -1,14 +1,13 @@ package ws import ( - "context" - "github.com/coder/websocket" - "github.com/coder/websocket/wsjson" + "fmt" "github.com/go-chi/chi/v5" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" "log/slog" "net/http" + "time" ) func Handle() http.HandlerFunc { @@ -17,18 +16,8 @@ func Handle() http.HandlerFunc { sessionCookie, _ := r.Cookie("session_id") - c, err := websocket.Accept(w, r, nil) - - // 2 mb - c.SetReadLimit(2 * 1024 * 1024) - - if err != nil { - return - } - if sessionCookie == nil { slog.Error("session cookie not found") - c.Close(websocket.StatusPolicyViolation, "no session") return } @@ -41,27 +30,48 @@ func Handle() http.HandlerFunc { if roomId == "" { slog.Error("invalid room", slog.String("room_id", roomId)) - manager.CloseWithError(sessionId, websocket.StatusPolicyViolation, "invalid room") + manager.CloseWithError(sessionId, 1008, "invalid room") return } - manager.Add(roomId, sessionId, c) + done := make(chan CloseEvent, 50) + flush := make(chan bool, 50) + + manager.Add(roomId, sessionId, w, done, flush) defer func() { manager.Disconnect(sessionId) }() + // Set the necessary headers + w.Header().Set("Content-Type", "text/event-stream") + w.Header().Set("Cache-Control", "no-cache") + w.Header().Set("Connection", "keep-alive") + w.Header().Set("Access-Control-Allow-Origin", "*") // Optional for CORS + + // Flush the headers immediately + flusher, ok := w.(http.Flusher) + + if !ok { + http.Error(w, "Streaming unsupported", http.StatusInternalServerError) + return + } + + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() + for { - var v map[string]any - err = wsjson.Read(context.Background(), c, &v) - if err != nil { - manager.CloseWithError(sessionId, websocket.StatusInternalError, "failed to read message") + select { + case <-ticker.C: + manager.Ping(sessionId) + case <-flush: + if flusher != nil { + flusher.Flush() + } + case <-done: // Client closed the connection + fmt.Println("Client disconnected") return } - if v != nil { - manager.OnMessage(sessionId, v) - } - } } } diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index 1c03baa..fb25f7d 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -1,9 +1,9 @@ package ws import ( - "context" - "github.com/coder/websocket" + "fmt" "github.com/puzpuzpuz/xsync/v3" + "net/http" ) type EventType string @@ -21,10 +21,17 @@ type SocketEvent struct { Payload map[string]any } +type CloseEvent struct { + Code int + Reason string +} + type SocketConnection struct { Id string - Conn *websocket.Conn + Writer http.ResponseWriter RoomId string + Done chan CloseEvent + Flush chan bool } type SocketManager struct { @@ -77,7 +84,7 @@ func (manager *SocketManager) OnMessage(id string, message map[string]any) { }) } -func (manager *SocketManager) Add(roomId string, id string, conn *websocket.Conn) { +func (manager *SocketManager) Add(roomId string, id string, writer http.ResponseWriter, done chan CloseEvent, flush chan bool) { manager.idToRoom.Store(id, roomId) sockets, ok := manager.sockets.LoadOrCompute(roomId, func() *xsync.MapOf[string, SocketConnection] { @@ -86,8 +93,10 @@ func (manager *SocketManager) Add(roomId string, id string, conn *websocket.Conn sockets.Store(id, SocketConnection{ Id: id, - Conn: conn, + Writer: writer, RoomId: roomId, + Done: done, + Flush: flush, }) s, ok := sockets.Load(id) @@ -117,11 +126,14 @@ func (manager *SocketManager) OnClose(id string) { manager.sockets.Delete(id) } -func (manager *SocketManager) CloseWithError(id string, code websocket.StatusCode, message string) { +func (manager *SocketManager) CloseWithError(id string, code int, message string) { conn := manager.Get(id) if conn != nil { go manager.OnClose(id) - conn.Conn.Close(code, message) + conn.Done <- CloseEvent{ + Code: code, + Reason: message, + } } } @@ -129,7 +141,10 @@ func (manager *SocketManager) Disconnect(id string) { conn := manager.Get(id) if conn != nil { go manager.OnClose(id) - _ = conn.Conn.CloseNow() + conn.Done <- CloseEvent{ + Code: -1, + Reason: "", + } } } @@ -146,8 +161,30 @@ func (manager *SocketManager) Get(id string) *SocketConnection { return &conn } -func (manager *SocketManager) Broadcast(roomId string, message []byte, messageType websocket.MessageType, predicate func(conn SocketConnection) bool) { - ctx := context.Background() +func (manager *SocketManager) Ping(id string) { + conn := manager.Get(id) + if conn != nil { + manager.writeText(*conn, "ping", "") + } +} + +func (manager *SocketManager) writeText(socket SocketConnection, event string, message string) { + if socket.Writer == nil { + return + } + var err error + if event != "" { + _, err = fmt.Fprintf(socket.Writer, "event: %s\ndata: %s\n\n", event, message) + } else { + _, err = fmt.Fprintf(socket.Writer, "data: %s\n\n", message) + } + if err != nil { + manager.CloseWithError(socket.Id, 1008, "failed to write message") + } + socket.Flush <- true +} + +func (manager *SocketManager) BroadcastText(roomId string, message string, predicate func(conn SocketConnection) bool) { sockets, ok := manager.sockets.Load(roomId) if !ok { @@ -156,19 +193,15 @@ func (manager *SocketManager) Broadcast(roomId string, message []byte, messageTy sockets.Range(func(id string, conn SocketConnection) bool { if predicate(conn) { - conn.Conn.Write(ctx, messageType, message) + manager.writeText(conn, "", message) } return true }) } -func (manager *SocketManager) BroadcastText(roomId string, message string, predicate func(conn SocketConnection) bool) { - manager.Broadcast(roomId, []byte(message), websocket.MessageText, predicate) -} - func (manager *SocketManager) SendText(id string, message string) { conn := manager.Get(id) if conn != nil { - _ = conn.Conn.Write(context.Background(), websocket.MessageText, []byte(message)) + manager.writeText(*conn, "", message) } } diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index dd38524..a9fd1ab 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let x=consumeCSSSelector(o);x.length>0&&(s+=" "+x);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),g=l.value;if(c.lastValue===g)return;c.lastValue=g;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(h,b){s=h,l=b;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let g=getInternalData(n),x=g.lastButtonClicked;if(x){let h=getRawAttribute(x,"formaction");h!=null&&(t=h);let b=getRawAttribute(x,"formmethod");b!=null&&b.toLowerCase()!=="dialog"&&(e=b);}let C=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:C})===!1)return maybeCall(s),a;let v=n,E=getClosestAttributeValue(n,"hx-sync"),p=null,T=!1;if(E){let h=E.split(":"),b=h[0].trim();if(b==="this"?v=findThisElement(n,"hx-sync"):v=asElement(querySelectorExt(n,b)),E=(h[1]||"drop").trim(),g=getInternalData(v),E==="drop"&&g.xhr&&g.abortable!==!0)return maybeCall(s),a;if(E==="abort"){if(g.xhr)return maybeCall(s),a;T=!0;}else E==="replace"?triggerEvent(v,"htmx:abort"):E.indexOf("queue")===0&&(p=(E.split(" ")[1]||"last").trim());}if(g.xhr)if(g.abortable)triggerEvent(v,"htmx:abort");else {if(p==null){if(r){let h=getInternalData(r);h&&h.triggerSpec&&h.triggerSpec.queue&&(p=h.triggerSpec.queue);}p==null&&(p="last");}return g.queuedRequests==null&&(g.queuedRequests=[]),p==="first"&&g.queuedRequests.length===0?g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):p==="all"?g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):p==="last"&&(g.queuedRequests=[],g.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let y=new XMLHttpRequest;g.xhr=y,g.abortable=T;let R=function(){g.xhr=null,g.abortable=!1,g.queuedRequests!=null&&g.queuedRequests.length>0&&g.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var L=prompt(N);if(L===null||!triggerEvent(n,"htmx:prompt",{prompt:L,target:c}))return maybeCall(s),R(),a}if(C&&!i&&!confirm(C))return maybeCall(s),R(),a;let D=getHeaders(n,c,L);e!=="get"&&!usesFormData(n)&&(D["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(D=mergeObjects(D,o.headers));let S=getInputValues(n,e),q=S.errors,k=S.formData;o.values&&overrideFormData(k,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),j=overrideFormData(k,_),P=filterValues(j,n);htmx.config.getCacheBusterParam&&e==="get"&&P.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,A={boosted:G,useUrlParams:M,formData:P,parameters:formDataProxy(P),unfilteredFormData:j,unfilteredParameters:formDataProxy(j),headers:D,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",A))return maybeCall(s),R(),a;if(t=A.path,e=A.verb,D=A.headers,P=formDataFromObject(A.parameters),q=A.errors,M=A.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",A),maybeCall(s),R(),a;let Y=t.split("#"),Z=Y[0],z=Y[1],I=t;if(M&&(I=Z,!P.keys().next().done&&(I.indexOf("?")<0?I+="?":I+="&",I+=urlEncode(P),z&&(I+="#"+z))),!verifyPath(n,I,A))return triggerErrorEvent(n,"htmx:invalidPath",A),maybeCall(l),a;if(y.open(e.toUpperCase(),I,!0),y.overrideMimeType("text/html"),y.withCredentials=A.withCredentials,y.timeout=A.timeout,!X.noHeaders){for(let h in D)if(D.hasOwnProperty(h)){let b=D[h];safelySetHeaderValue(y,h,b);}}let w={xhr:y,target:c,requestConfig:A,etc:o,boosted:G,select:d,pathInfo:{requestPath:t,finalRequestPath:I,responsePath:null,anchor:z}};if(y.onload=function(){try{let h=hierarchyForElt(n);if(w.pathInfo.responsePath=getPathFromResponse(y),u(n,w),w.keepIndicators!==!0&&removeRequestIndicators(F,V),triggerEvent(n,"htmx:afterRequest",w),triggerEvent(n,"htmx:afterOnLoad",w),!bodyContains(n)){let b=null;for(;h.length>0&&b==null;){let O=h.shift();bodyContains(O)&&(b=O);}b&&(triggerEvent(b,"htmx:afterRequest",w),triggerEvent(b,"htmx:afterOnLoad",w));}maybeCall(s),R();}catch(h){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:h},w)),h}},y.onerror=function(){removeRequestIndicators(F,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:sendError",w),maybeCall(l),R();},y.onabort=function(){removeRequestIndicators(F,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:sendAbort",w),maybeCall(l),R();},y.ontimeout=function(){removeRequestIndicators(F,V),triggerErrorEvent(n,"htmx:afterRequest",w),triggerErrorEvent(n,"htmx:timeout",w),maybeCall(l),R();},!triggerEvent(n,"htmx:beforeRequest",w))return maybeCall(s),R(),a;var F=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(h){forEach([y,y.upload],function(b){b.addEventListener(h,function(O){triggerEvent(n,"htmx:xhr:"+h,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",w);let ee=M?null:encodeParamsForBody(y,n,P);return y.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(L,p.swapDelay):L();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),m=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}m.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});m.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var H=m.config,W,ae="hx-target-";function K(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(K(n,"4")||K(n,"5"))&&r.push("error");for(let o=0;o{W=e,H.responseTargetUnsetsError===void 0&&(H.responseTargetUnsetsError=!0),H.responseTargetSetsError===void 0&&(H.responseTargetSetsError=!1),H.responseTargetPrefersExisting===void 0&&(H.responseTargetPrefersExisting=!1),H.responseTargetPrefersRetargetHeader===void 0&&(H.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(H.responseTargetPrefersExisting||H.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,Q(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(Q(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});m.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&m.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{m.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";m.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(m.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;m.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var f;function fe(e){return e.trim().split(/\s+/)}function de(e){let t=f.getAttributeValue(e,"hx-ws");if(t){let n=fe(t);for(let r=0;rbe(t));n.addEventListener("message",r=>{if(U(e))return;let o=r.data;if(!f.triggerEvent(e,"htmx:wsBeforeMessage",{message:o,socketWrapper:n.publicInterface}))return;f.withExtensions(e,l=>{o=l.transformResponse(o,null,e);});let i=f.makeSettleInfo(e),s=f.makeFragment(o);if(s.children.length){let l=Array.from(s.children);for(let a=0;a0;){let r=this.messageQueue[0];if(this.socket.readyState===this.socket.OPEN)this.sendImmediately(r.message,r.sendElt),this.messageQueue.shift();else break}},init(){this.socket&&this.socket.readyState===this.socket.OPEN&&this.socket.close();let r=t();f.triggerEvent(e,"htmx:wsConnecting",{event:{type:"connecting"}}),this.socket=r,r.onopen=i=>{this.retryCount=0,f.triggerEvent(e,"htmx:wsOpen",{event:i,socketWrapper:this.publicInterface}),this.handleQueuedMessages();},r.onclose=i=>{if(!U(e)&&[1006,1012,1013].indexOf(i.code)>=0){let s=ye(this.retryCount);setTimeout(()=>{this.retryCount+=1,this.init();},s);}f.triggerEvent(e,"htmx:wsClose",{event:i,socketWrapper:this.publicInterface});},r.onerror=i=>{f.triggerErrorEvent(e,"htmx:wsError",{error:i,socketWrapper:this}),U(e);};let o=this.events;Object.keys(o).forEach(i=>{o[i].forEach(s=>{r.addEventListener(i,s);});});},close(){this.socket.close();},publicInterface:{}};return n.init(),n.publicInterface={send:n.send.bind(n),sendImmediately:n.sendImmediately.bind(n),queue:n.messageQueue},n}function me(e){let t=f.getAttributeValue(e,"hx-ws");if(t&&t!=="send")return;let n=f.getClosestMatch(e,r=>Ee(r));n&&pe(n,e);}function Ee(e){return f.getInternalData(e).webSocket!=null}function pe(e,t){let n=f.getInternalData(t);f.getTriggerSpecs(t).forEach(o=>{f.addTriggerHandler(t,o,n,(i,s)=>{if(U(e))return;let l=f.getInternalData(e).webSocket,a=f.getHeaders(t,f.getTarget(t)),u=f.getInputValues(t,"post"),d=u.errors,c=Object.assign({},u.values),g=f.getExpressionVars(t),x=f.mergeObjects(c,g),v={parameters:f.filterValues(x,t),unfilteredParameters:x,headers:a,errors:d,triggeringEvent:s,messageBody:void 0,socketWrapper:l.publicInterface};if(!f.triggerEvent(i,"htmx:wsConfigSend",v))return;if(d&&d.length>0){f.triggerEvent(i,"htmx:validation:halted",d);return}let E=v.messageBody;if(E===void 0){let p=Object.assign({},v.parameters);v.headers&&(p.HEADERS=a),E=JSON.stringify(p);}l.send(E,i),s&&f.shouldCancel(s,i)&&s.preventDefault();});});}function ye(e){let t=Math.min(e,6);return 1e3*Math.pow(2,t)*Math.random()}function U(e){return f.bodyContains(e)?!1:(f.getInternalData(e).webSocket.close(),!0)}function be(e){let t=new WebSocket(e,[]);return t.binaryType=m.config.wsBinaryType||"blob",t}m.defineExtension("ws",{init:e=>{f=e;},onEvent:(e,t)=>{let n=t.target||t.detail.elt;if(n instanceof HTMLElement)switch(e){case"htmx:beforeCleanupElement":J(n);let r=f.getInternalData(n);r.webSocket&&r.webSocket.close();return;case"htmx:beforeProcessNode":n.hasAttribute("ws-connect")&&ge(n),n.hasAttribute("ws-send")&&me(n);}}});function xe(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}xe((e,t)=>{ve(t);});function ve(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))m.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),m.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){m.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&m.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var ee=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},P=getClosestAttributeValue(n,"hx-prompt");if(P){var I=prompt(P);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,N=v.formData;o.values&&overrideFormData(N,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(N,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),J=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:J,useUrlParams:F,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,F=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let G=t.split("#"),K=G[0],j=G[1],D=t;if(F&&(D=K,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:J,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let Z=F?null:encodeParamsForBody(m,n,L);return m.send(Z),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=ee;function te(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=re(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=ie(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&Y(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return Y(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,k,se="hx-target-";function $(e,t){return e.substring(0,t.length)===t}function ae(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];($(n,"4")||$(n,"5"))&&r.push("error");for(let o=0;o{k=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=ae(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,le());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function le(){window.location.reload();}var ue=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&ce(t.target);}});function ce(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ue)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var B=null,Q=new Set;h.defineExtension("sse",{init:function(e){B=e;},onEvent:function(e,t){if(t.target instanceof HTMLElement&&e==="htmx:beforeProcessNode"){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!Q.has(i)&&(fe(o,i),Q.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.onopen=function(r){console.log("EventSource open:",r),h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){console.log("EventSource message:",r.data),h.trigger(e,"htmx:sseBeforeMessage",{event:r});let o=r.data,i=B.makeFragment(o),s=Array.from(i.children);for(let l of s)B.oobSwap(B.getAttributeValue(l,"hx-swap-oob")||"true",l,{tasks:[]}),l.tagName==="SCRIPT"&&l.id.startsWith("__eval")&&document.body.appendChild(l);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy93cy50cyIsIi4uL2pzL2h0bWdvLnRzIl0sIm5hbWVzIjpbImh0bXgiLCJlbHQiLCJ0eXBlIiwidmVyYiIsInRhZyIsImdsb2JhbCIsInN0ciIsImludGVydmFsIiwibmFtZSIsInF1YWxpZmllZE5hbWUiLCJwYXJlbnQiLCJjb25kaXRpb24iLCJpbml0aWFsRWxlbWVudCIsImFuY2VzdG9yIiwiYXR0cmlidXRlTmFtZSIsImF0dHJpYnV0ZVZhbHVlIiwiZGlzaW5oZXJpdCIsImluaGVyaXQiLCJjbG9zZXN0QXR0ciIsImUiLCJzZWxlY3RvciIsIm1hdGNoZXNGdW5jdGlvbiIsIm1hdGNoIiwicmVzcCIsImZyYWdtZW50Iiwic2NyaXB0IiwibmV3U2NyaXB0IiwiYXR0ciIsInJlc3BvbnNlIiwicmVzcG9uc2VXaXRoTm9IZWFkIiwic3RhcnRUYWciLCJkb2MiLCJ0aXRsZUVsZW1lbnQiLCJmdW5jIiwibyIsImRhdGFQcm9wIiwiZGF0YSIsImFyciIsInJldHVybkFyciIsImkiLCJlbCIsInJlY3QiLCJlbGVtVG9wIiwiZWxlbUJvdHRvbSIsInJvb3ROb2RlIiwidHJpZ2dlciIsIm9iajEiLCJvYmoyIiwia2V5IiwialN0cmluZyIsImVycm9yIiwidGVzdCIsInBhdGgiLCJ1cmwiLCJjYWxsYmFjayIsImV2dCIsImV2ZW50IiwiZWx0T3JTZWxlY3RvciIsImRlbGF5IiwidmFsdWUiLCJjbGF6eiIsIm5vZGUiLCJjaGlsZCIsInByZWZpeCIsInN1ZmZpeCIsInRyaW1tZWRTZWxlY3RvciIsInN0YXJ0IiwicmVzdWx0cyIsImNvbnRleHQiLCJhcmcxIiwiYXJnMiIsImFyZzMiLCJldmVudEFyZ3MiLCJhdHRyTmFtZSIsImF0dHJUYXJnZXQiLCJyZXN1bHQiLCJhdHRyaWJ1dGUiLCJ0YXJnZXRTdHIiLCJhdHRyaWJ1dGVzVG9TZXR0bGUiLCJtZXJnZVRvIiwibWVyZ2VGcm9tIiwic3dhcFN0eWxlIiwidGFyZ2V0IiwiZXh0ZW5zaW9ucyIsImV4dGVuc2lvbiIsIm9vYlZhbHVlIiwib29iRWxlbWVudCIsInNldHRsZUluZm8iLCJ0YXJnZXRzIiwib29iRWxlbWVudENsb25lIiwiYmVmb3JlU3dhcERldGFpbHMiLCJwcmVzZXJ2ZWRFbHQiLCJpZCIsIm9sZEVsdCIsInBhcmVudE5vZGUiLCJuZXdOb2RlIiwibm9ybWFsaXplZElkIiwibm9ybWFsaXplZFRhZyIsInBhcmVudEVsdCIsIm9sZE5vZGUiLCJuZXdBdHRyaWJ1dGVzIiwiYXV0b2ZvY3VzIiwiYXV0b0ZvY3VzZWRFbHQiLCJpbnNlcnRCZWZvcmUiLCJzdHJpbmciLCJoYXNoIiwiY2hhciIsImludGVybmFsRGF0YSIsImhhbmRsZXJJbmZvIiwiZWxlbWVudCIsImluZm8iLCJuZXdFbHQiLCJlbHRCZWZvcmVOZXdDb250ZW50IiwiZmlyc3RDaGlsZCIsImV4dCIsIm5ld0VsZW1lbnRzIiwiaiIsIm9vYkVsdHMiLCJjb250ZW50Iiwic3dhcFNwZWMiLCJzd2FwT3B0aW9ucyIsImFjdGl2ZUVsdCIsInNlbGVjdGlvbkluZm8iLCJvb2JTZWxlY3RWYWx1ZXMiLCJvb2JTZWxlY3RWYWx1ZSIsInRlbXBsYXRlIiwibmV3RnJhZ21lbnQiLCJuZXdBY3RpdmVFbHQiLCJmb2N1c09wdGlvbnMiLCJkb1NldHRsZSIsInRhc2siLCJhbmNob3JUYXJnZXQiLCJ4aHIiLCJoZWFkZXIiLCJ0cmlnZ2VyQm9keSIsInRyaWdnZXJzIiwiZXZlbnROYW1lIiwiZGV0YWlsIiwiZXZlbnROYW1lcyIsInRva2VucyIsInBvc2l0aW9uIiwic3RhcnRQb3NpdGlvbiIsInN0YXJ0Q2hhciIsInN5bWJvbCIsInRva2VuIiwibGFzdCIsInBhcmFtTmFtZSIsImJyYWNrZXRDb3VudCIsImNvbmRpdGlvbmFsU291cmNlIiwiY29uZGl0aW9uRnVuY3Rpb24iLCJleHBsaWNpdFRyaWdnZXIiLCJjYWNoZSIsInRyaWdnZXJTcGVjcyIsImluaXRpYWxMZW5ndGgiLCJldmVyeSIsImV2ZW50RmlsdGVyIiwidHJpZ2dlclNwZWMiLCJmcm9tX2FyZyIsImhhbmRsZXIiLCJzcGVjIiwibm9kZURhdGEiLCJyYXdBdHRyaWJ1dGUiLCJzb3VyY2UiLCJleHBsaWNpdENhbmNlbCIsImVsZW1lbnREYXRhIiwiZWx0c1RvTGlzdGVuT24iLCJlbHRUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbkRhdGEiLCJldmVudExpc3RlbmVyIiwiZXZlbnREYXRhIiwibG9hZCIsImV4cGxpY2l0QWN0aW9uIiwib2JzZXJ2ZXJPcHRpb25zIiwiZW50cmllcyIsImF0dHJpYnV0ZXMiLCJlbGVtZW50cyIsIml0ZXIiLCJib29zdGVkU2VsZWN0b3IiLCJleHRlbnNpb25TZWxlY3RvcnMiLCJzZWxlY3RvcnMiLCJzIiwiZm9ybSIsImNvZGUiLCJsaXN0ZW5lciIsImFmdGVyT25Qb3NpdGlvbiIsIm5leHRDaGFyIiwidG9EbyIsIm1zZyIsImV2ZW50UmVzdWx0Iiwia2ViYWJOYW1lIiwia2ViYWJlZEV2ZW50Iiwicm9vdEVsdCIsImlubmVySFRNTCIsInRpdGxlIiwic2Nyb2xsIiwiaGlzdG9yeUNhY2hlIiwibmV3SGlzdG9yeUl0ZW0iLCJjbGFzc05hbWUiLCJjbG9uZSIsImRpc2FibGVIaXN0b3J5Q2FjaGUiLCJ0YXNrcyIsInJlcXVlc3QiLCJkZXRhaWxzIiwiaGlzdG9yeUVsZW1lbnQiLCJjYWNoZWQiLCJpbmRpY2F0b3JzIiwiaWMiLCJkaXNhYmxlZEVsdHMiLCJkaXNhYmxlZEVsZW1lbnQiLCJkaXNhYmxlZCIsInByb2Nlc3NlZCIsImZvcm1EYXRhIiwidiIsInZhbHVlcyIsImVycm9ycyIsInZhbGlkYXRlIiwiaW5wdXQiLCJyZWNlaXZlciIsImRvbm9yIiwicHJpb3JpdHlGb3JtRGF0YSIsImJ1dHRvbiIsImluY2x1ZGVzIiwiZGVzY2VuZGFudCIsInJldHVyblN0ciIsInJlYWxWYWx1ZSIsInByb21wdCIsImhlYWRlcnMiLCJpbnB1dFZhbHVlcyIsInBhcmFtc1ZhbHVlIiwibmV3VmFsdWVzIiwic3dhcEluZm9PdmVycmlkZSIsInN3YXBJbmZvIiwic3BsaXQiLCJzcGxpdFNwZWMiLCJzY3JvbGxWYWwiLCJzZWxlY3RvclZhbCIsInNob3dWYWwiLCJmb2N1c1Njcm9sbFZhbCIsImZpbHRlcmVkUGFyYW1ldGVycyIsImVuY29kZWRQYXJhbWV0ZXJzIiwiZmlyc3QiLCJldmFsQXNEZWZhdWx0IiwiZXZhbHVhdGVWYWx1ZSIsInZhcnNWYWx1ZXMiLCJ0b0V2YWwiLCJkZWZhdWx0VmFsIiwiZXhwcmVzc2lvblZhcnMiLCJoZWFkZXJWYWx1ZSIsInJlZ2V4cCIsInJlcXVlc3RDb25maWciLCJzYW1lSG9zdCIsIm9iaiIsImFycmF5IiwiaW5kZXgiLCJwcm9wIiwiZXRjIiwiY29uZmlybWVkIiwicmVzb2x2ZSIsInJlamVjdCIsInByb21pc2UiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJyZXNwb25zZUhhbmRsZXIiLCJzZWxlY3QiLCJlbHREYXRhIiwic3VibWl0dGVyIiwiYnV0dG9uUGF0aCIsImJ1dHRvblZlcmIiLCJjb25maXJtUXVlc3Rpb24iLCJza2lwQ29uZmlybWF0aW9uIiwic3luY0VsdCIsInN5bmNTdHJhdGVneSIsInF1ZXVlU3RyYXRlZ3kiLCJhYm9ydGFibGUiLCJzeW5jU3RyaW5ncyIsImVuZFJlcXVlc3RMb2NrIiwicHJvbXB0UXVlc3Rpb24iLCJwcm9tcHRSZXNwb25zZSIsInJhd0Zvcm1EYXRhIiwiYWxsRm9ybURhdGEiLCJmaWx0ZXJlZEZvcm1EYXRhIiwicmVxdWVzdEF0dHJWYWx1ZXMiLCJlbHRJc0Jvb3N0ZWQiLCJ1c2VVcmxQYXJhbXMiLCJzcGxpdFBhdGgiLCJwYXRoTm9BbmNob3IiLCJhbmNob3IiLCJmaW5hbFBhdGgiLCJyZXNwb25zZUluZm8iLCJoaWVyYXJjaHkiLCJkaXNhYmxlRWx0cyIsInNlY29uZGFyeVRyaWdnZXJFbHQiLCJwYXJlbnRFbHRJbkhpZXJhcmNoeSIsInBhcmFtcyIsInBhdGhGcm9tSGVhZGVycyIsInR5cGVGcm9tSGVhZGVycyIsInJlcXVlc3RQYXRoIiwicmVzcG9uc2VQYXRoIiwicHVzaFVybCIsInJlcGxhY2VVcmwiLCJlbGVtZW50SXNCb29zdGVkIiwic2F2ZVR5cGUiLCJyZXNwb25zZUhhbmRsaW5nQ29uZmlnIiwic3RhdHVzIiwicmVnRXhwIiwicmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQiLCJ0aXRsZUVsdCIsInJlc3BvbnNlSW5mb1NlbGVjdCIsInJlZGlyZWN0UGF0aCIsInJlZGlyZWN0U3dhcFNwZWMiLCJzaG91bGRSZWZyZXNoIiwiaGlzdG9yeVVwZGF0ZSIsInJlc3BvbnNlSGFuZGxpbmciLCJzaG91bGRTd2FwIiwiaXNFcnJvciIsImlnbm9yZVRpdGxlIiwic2VsZWN0T3ZlcnJpZGUiLCJzd2FwT3ZlcnJpZGUiLCJzZXJ2ZXJSZXNwb25zZSIsInNldHRsZVJlc29sdmUiLCJzZXR0bGVSZWplY3QiLCJzZWxlY3RPT0IiLCJkb1N3YXAiLCJmaW5hbEVsdCIsInNob3VsZFRyYW5zaXRpb24iLCJzZXR0bGVQcm9taXNlIiwiaW5uZXJEb1N3YXAiLCJhcGkiLCJ0ZXh0IiwicGFyYW1ldGVycyIsImV4dGVuc2lvbnNUb1JldHVybiIsImV4dGVuc2lvbnNUb0lnbm9yZSIsImV4dGVuc2lvbnNGb3JFbGVtZW50IiwiZXh0ZW5zaW9uTmFtZSIsImZuIiwibm9uY2VBdHRyaWJ1dGUiLCJtZXRhQ29uZmlnIiwiYm9keSIsInJlc3RvcmVkRWx0cyIsIm9yaWdpbmFsUG9wc3RhdGUiLCJodG14X2VzbV9kZWZhdWx0IiwiZGVwZW5kc09uIiwicGF0aFNwZWMiLCJkZXBlbmRlbmN5UGF0aCIsInVybFBhdGgiLCJkZXBlbmRlbmN5RWxlbWVudCIsInBhdGhFbGVtZW50IiwicmVmcmVzaFBhdGgiLCJlbHRzV2l0aERlcHMiLCJjb25maWciLCJrZWJhYkV2ZW50TmFtZSIsImlnbm9yZWRFdmVudHMiLCJtYWtlRXZlbnQiLCJ0cmlnZ2VyQ2hpbGRyZW4iLCJ0cmlnZ2VyZWQiLCJuZXdFdmVudCIsImF0dHJQcmVmaXgiLCJzdGFydHNXaXRoIiwiZ2V0UmVzcENvZGVUYXJnZXQiLCJyZXNwQ29kZU51bWJlciIsInJlc3BDb2RlIiwiYXR0clBvc3NpYmlsaXRpZXMiLCJhdHRyVmFsdWUiLCJoYW5kbGVFcnJvckZsYWciLCJhcGlSZWYiLCJsYXN0VmVyc2lvbiIsImVuYWJsZWQiLCJldmVudFNvdXJjZSIsIm1lc3NhZ2UiLCJyZWxvYWQiLCJldmFsRnVuY1JlZ2V4IiwicmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMiLCJtYXRjaGVzIiwiZWxlIiwic3BsaXRPbldoaXRlc3BhY2UiLCJnZXRMZWdhY3lXZWJzb2NrZXRVUkwiLCJsZWdhY3lTU0VWYWx1ZSIsImVuc3VyZVdlYlNvY2tldCIsInNvY2tldEVsdCIsIndzc1NvdXJjZSIsImxlZ2FjeVNvdXJjZSIsImJhc2VfcGFydCIsInNvY2tldFdyYXBwZXIiLCJjcmVhdGVXZWJzb2NrZXRXcmFwcGVyIiwiY3JlYXRlV2ViU29ja2V0IiwibWF5YmVDbG9zZVdlYlNvY2tldFNvdXJjZSIsImNoaWxkcmVuIiwic29ja2V0RnVuYyIsIndyYXBwZXIiLCJzZW5kRWx0IiwicXVldWVkSXRlbSIsInNvY2tldCIsImdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5IiwiZXZlbnRzIiwiayIsImVuc3VyZVdlYlNvY2tldFNlbmQiLCJsZWdhY3lBdHRyaWJ1dGUiLCJ3ZWJTb2NrZXRQYXJlbnQiLCJoYXNXZWJTb2NrZXQiLCJwcm9jZXNzV2ViU29ja2V0U2VuZCIsInRzIiwicmF3UGFyYW1ldGVycyIsImFsbFBhcmFtZXRlcnMiLCJzZW5kQ29uZmlnIiwidG9TZW5kIiwicmV0cnlDb3VudCIsImV4cCIsInNvY2siLCJ3YXRjaFVybCIsImxhc3RVcmwiLCJfIiwibmV3VXJsIiwib25VcmxDaGFuZ2UiLCJoYXNNYXRjaCIsImRlZmF1bHRLZXkiXSwibWFwcGluZ3MiOiJBQUFBLElBQUlBLEVBQUFBLENBQVEsVUFBVyxDQUlyQixJQUFNLElBQU8sQ0FBQSxDQUlYLE9BQVEsSUFFUixDQUFBLE9BQUEsQ0FBUyxLQUVULEVBQUksQ0FBQSxJQUFBLENBRUosSUFBSyxJQUVMLENBQUEsT0FBQSxDQUFTLEtBRVQsSUFBTSxDQUFBLElBQUEsQ0FHTixJQUFNLENBQUEsSUFBQSxDQUVOLE9BQVMsQ0FBQSxJQUFBLENBRVQsUUFBUyxJQVVULENBQUEsTUFBQSxDQUFRLFNBQVNDLENBQUtDLENBQUFBLENBQUFBLENBQU0sQ0FFMUIsT0FEb0IsY0FBQSxDQUFlRCxDQUFLQyxDQUFBQSxDQUFBQSxFQUFRLE1BQU0sQ0FBQSxDQUNuQyxNQUNyQixDQUdBLENBQUEsTUFBQSxDQUFRLEtBRVIsUUFBVSxDQUFBLElBQUEsQ0FFVixZQUFhLElBRWIsQ0FBQSxXQUFBLENBQWEsSUFFYixDQUFBLFNBQUEsQ0FBVyxJQUVYLENBQUEsSUFBQSxDQUFNLEtBR04sZUFBaUIsQ0FBQSxJQUFBLENBRWpCLGdCQUFpQixJQUdqQixDQUFBLE1BQUEsQ0FBUSxLQUVSLE9BQVMsQ0FBQSxJQUFBLENBT1QsTUFBUSxDQUFBLElBQUEsQ0FRUixNQUFRLENBQUEsQ0FNTixlQUFnQixDQU1oQixDQUFBLENBQUEsZ0JBQUEsQ0FBa0IsR0FLbEIsb0JBQXNCLENBQUEsQ0FBQSxDQUFBLENBTXRCLGlCQUFrQixXQU1sQixDQUFBLGdCQUFBLENBQWtCLENBTWxCLENBQUEsa0JBQUEsQ0FBb0IsRUFNcEIsQ0FBQSxzQkFBQSxDQUF3QixHQU14QixjQUFnQixDQUFBLGdCQUFBLENB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Q0FBQUEsQ0FBQUEsQ0FBSUEsRUFBRyxZQUFhaEMsQ0FBQUEsQ0FBSSxHQUFLLEVBQUksQ0FBQSxDQUN6QyxVQUFXLFdBQ1gsQ0FBQSxTQUFBLENBQVcsQ0FDWCxDQUFBLFdBQUEsQ0FBYSxDQUNmLENBQUMsRUFDRHFaLENBQVcsQ0FBQSxDQUFBLENBQUEsQ0FDWCxLQUNGLENBQ0YsQ0FFRixHQUFJLENBQUNBLENBQUFBLENBQVUsQ0FDYixJQUFJQyxDQUFhdFgsQ0FBQUEsQ0FBQUEsQ0FBRyxhQUFhLHFCQUFxQixDQUFBLENBQ2xEc1gsR0FDRjFFLENBQUssQ0FBQSxJQUFBLENBQ0g1UyxFQUNBQSxDQUFHLENBQUEsWUFBQSxDQUFhLHNCQUF5QnNYLENBQUFBLENBQVUsQ0FBSyxFQUFBLEVBQUEsQ0FDeEQsQ0FBRSxTQUFXLENBQUEsV0FBQSxDQUFhLFVBQVcsQ0FBRyxDQUFBLFdBQUEsQ0FBYSxDQUFFLENBQ3pELEVBRUosQ0FDRixDQUFDLEVBQ0giLCJmaWxlIjoiaHRtZ28uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaHRteCA9IChmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnXG5cbiAgLy8gUHVibGljIEFQSVxuICBjb25zdCBodG14ID0ge1xuICAgIC8vIFRzYyBtYWRuZXNzIGhlcmUsIGFzc2lnbmluZyB0aGUgZnVuY3Rpb25zIGRpcmVjdGx5IHJlc3VsdHMgaW4gYW4gaW52YWxpZCBUeXBlU2NyaXB0IG91dHB1dCwgYnV0IHJlYXNzaWduaW5nIGlzIGZpbmVcbiAgICAvKiBFdmVudCBwcm9jZXNzaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygb25Mb2FkSGVscGVyfSAqL1xuICAgIG9uTG9hZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwcm9jZXNzTm9kZX0gKi9cbiAgICBwcm9jZXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZEV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9mZjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0cmlnZ2VyRXZlbnR9ICovXG4gICAgdHJpZ2dlcjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhamF4SGVscGVyfSAqL1xuICAgIGFqYXg6IG51bGwsXG4gICAgLyogRE9NIHF1ZXJ5aW5nIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kfSAqL1xuICAgIGZpbmQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZEFsbH0gKi9cbiAgICBmaW5kQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGNsb3Nlc3R9ICovXG4gICAgY2xvc2VzdDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbnB1dCB2YWx1ZXMgdGhhdCB3b3VsZCByZXNvbHZlIGZvciBhIGdpdmVuIGVsZW1lbnQgdmlhIHRoZSBodG14IHZhbHVlIHJlc29sdXRpb24gbWVjaGFuaXNtXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN2YWx1ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0IHRoZSBlbGVtZW50IHRvIHJlc29sdmUgdmFsdWVzIG9uXG4gICAgICogQHBhcmFtIHtIdHRwVmVyYn0gdHlwZSB0aGUgcmVxdWVzdCB0eXBlIChlLmcuICoqZ2V0Kiogb3IgKipwb3N0KiopIG5vbi1HRVQncyB3aWxsIGluY2x1ZGUgdGhlIGVuY2xvc2luZyBmb3JtIG9mIHRoZSBlbGVtZW50LiBEZWZhdWx0cyB0byAqKnBvc3QqKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgdmFsdWVzOiBmdW5jdGlvbihlbHQsIHR5cGUpIHtcbiAgICAgIGNvbnN0IGlucHV0VmFsdWVzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB0eXBlIHx8ICdwb3N0JylcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlcy52YWx1ZXNcbiAgICB9LFxuICAgIC8qIERPTSBtYW5pcHVsYXRpb24gaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZENsYXNzVG9FbGVtZW50fSAqL1xuICAgIGFkZENsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdG9nZ2xlQ2xhc3NPbkVsZW1lbnR9ICovXG4gICAgdG9nZ2xlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdGFrZUNsYXNzRm9yRWxlbWVudH0gKi9cbiAgICB0YWtlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygc3dhcH0gKi9cbiAgICBzd2FwOiBudWxsLFxuICAgIC8qIEV4dGVuc2lvbiBlbnRyeXBvaW50cyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGRlZmluZUV4dGVuc2lvbn0gKi9cbiAgICBkZWZpbmVFeHRlbnNpb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXh0ZW5zaW9ufSAqL1xuICAgIHJlbW92ZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dBbGx9ICovXG4gICAgbG9nQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ05vbmV9ICovXG4gICAgbG9nTm9uZTogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKipcbiAgICAgKiBUaGUgbG9nZ2VyIGh0bXggdXNlcyB0byBsb2cgd2l0aFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nZ2VyXG4gICAgICovXG4gICAgbG9nZ2VyOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHkgaG9sZGluZyB0aGUgY29uZmlndXJhdGlvbiBodG14IHVzZXMgYXQgcnVudGltZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB1c2luZyBhIFttZXRhIHRhZ10oaHR0cHM6Ly9odG14Lm9yZy9kb2NzLyNjb25maWcpIGlzIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHRoZXNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjb25maWdcbiAgICAgKi9cbiAgICBjb25maWc6IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byB1c2UgaGlzdG9yeS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUVuYWJsZWQ6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8ga2VlcCBpbiAqKmxvY2FsU3RvcmFnZSoqIGZvciBoaXN0b3J5IHN1cHBvcnQuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlDYWNoZVNpemU6IDEwLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICByZWZyZXNoT25IaXN0b3J5TWlzczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IHN3YXAgc3R5bGUgdG8gdXNlIGlmICoqW2h4LXN3YXBdKGh0dHBzOi8vaHRteC5vcmcvYXR0cmlidXRlcy9oeC1zd2FwKSoqIGlzIG9taXR0ZWQuXG4gICAgICAgKiBAdHlwZSBIdG14U3dhcFN0eWxlXG4gICAgICAgKiBAZGVmYXVsdCAnaW5uZXJIVE1MJ1xuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcFN0eWxlOiAnaW5uZXJIVE1MJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiByZWNlaXZpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGRvaW5nIHRoZSBzd2FwLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwRGVsYXk6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gY29tcGxldGluZyB0aGUgY29udGVudCBzd2FwIGFuZCBzZXR0bGluZyBhdHRyaWJ1dGVzLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U2V0dGxlRGVsYXk6IDIwLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0cnVlLCBodG14IHdpbGwgaW5qZWN0IGEgc21hbGwgYW1vdW50IG9mIENTUyBpbnRvIHRoZSBwYWdlIHRvIG1ha2UgaW5kaWNhdG9ycyBpbnZpc2libGUgdW5sZXNzIHRoZSAqKmh0bXgtaW5kaWNhdG9yKiogY2xhc3MgaXMgcHJlc2VudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaW5jbHVkZUluZGljYXRvclN0eWxlczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIGluZGljYXRvcnMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1pbmRpY2F0b3InXG4gICAgICAgKi9cbiAgICAgIGluZGljYXRvckNsYXNzOiAnaHRteC1pbmRpY2F0b3InLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdHJpZ2dlcmluZyBlbGVtZW50cyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXJlcXVlc3QnXG4gICAgICAgKi9cbiAgICAgIHJlcXVlc3RDbGFzczogJ2h0bXgtcmVxdWVzdCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byB0ZW1wb3JhcmlseSBwbGFjZSBvbiBlbGVtZW50cyB0aGF0IGh0bXggaGFzIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWFkZGVkJ1xuICAgICAgICovXG4gICAgICBhZGRlZENsYXNzOiAnaHRteC1hZGRlZCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc2V0dGxpbmcnXG4gICAgICAgKi9cbiAgICAgIHNldHRsaW5nQ2xhc3M6ICdodG14LXNldHRsaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHN3YXBwaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zd2FwcGluZydcbiAgICAgICAqL1xuICAgICAgc3dhcHBpbmdDbGFzczogJ2h0bXgtc3dhcHBpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvd3MgdGhlIHVzZSBvZiBldmFsLWxpa2UgZnVuY3Rpb25hbGl0eSBpbiBodG14LCB0byBlbmFibGUgKipoeC12YXJzKiosIHRyaWdnZXIgY29uZGl0aW9ucyAmIHNjcmlwdCB0YWcgZXZhbHVhdGlvbi4gQ2FuIGJlIHNldCB0byAqKmZhbHNlKiogZm9yIENTUCBjb21wYXRpYmlsaXR5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd0V2YWw6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byBmYWxzZSwgZGlzYWJsZXMgdGhlIGludGVycHJldGF0aW9uIG9mIHNjcmlwdCB0YWdzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd1NjcmlwdFRhZ3M6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHNjcmlwdHMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVNjcmlwdE5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc3R5bGVzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTdHlsZU5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGF0dHJpYnV0ZXMgdG8gc2V0dGxlIGR1cmluZyB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgICAgICogQGRlZmF1bHQgWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXVxuICAgICAgICovXG4gICAgICBhdHRyaWJ1dGVzVG9TZXR0bGU6IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93IGNyb3NzLXNpdGUgQWNjZXNzLUNvbnRyb2wgcmVxdWVzdHMgdXNpbmcgY3JlZGVudGlhbHMgc3VjaCBhcyBjb29raWVzLCBhdXRob3JpemF0aW9uIGhlYWRlcnMgb3IgVExTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgdGltZW91dDogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgKipnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheSoqIGZvciByZWNvbm5lY3RpbmcgYWZ0ZXIgdW5leHBlY3RlZCBjb25uZWN0aW9uIGxvc3MgYnkgdGhlIGV2ZW50IGNvZGUgKipBYm5vcm1hbCBDbG9zdXJlKiosICoqU2VydmljZSBSZXN0YXJ0Kiogb3IgKipUcnkgQWdhaW4gTGF0ZXIqKi5cbiAgICAgICAqIEB0eXBlIHsnZnVsbC1qaXR0ZXInIHwgKChyZXRyeUNvdW50Om51bWJlcikgPT4gbnVtYmVyKX1cbiAgICAgICAqIEBkZWZhdWx0IFwiZnVsbC1qaXR0ZXJcIlxuICAgICAgICovXG4gICAgICB3c1JlY29ubmVjdERlbGF5OiAnZnVsbC1qaXR0ZXInLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdHlwZSBvZiBiaW5hcnkgZGF0YSBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICogQHR5cGUgQmluYXJ5VHlwZVxuICAgICAgICogQGRlZmF1bHQgJ2Jsb2InXG4gICAgICAgKi9cbiAgICAgIHdzQmluYXJ5VHlwZTogJ2Jsb2InLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJ1xuICAgICAgICovXG4gICAgICBkaXNhYmxlU2VsZWN0b3I6ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgeydhdXRvJyB8ICdpbnN0YW50JyB8ICdzbW9vdGgnfVxuICAgICAgICogQGRlZmF1bHQgJ2luc3RhbnQnXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoZSBmb2N1c2VkIGVsZW1lbnQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdmlldy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRGb2N1c1Njcm9sbDogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBpbmNsdWRlIGEgY2FjaGUtYnVzdGluZyBwYXJhbWV0ZXIgaW4gR0VUIHJlcXVlc3RzIHRvIGF2b2lkIGNhY2hpbmcgcGFydGlhbCByZXNwb25zZXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdldENhY2hlQnVzdGVyUGFyYW06IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgaHRteCB3aWxsIHVzZSB0aGUgVmlldyBUcmFuc2l0aW9uIEFQSSB3aGVuIHN3YXBwaW5nIGluIG5ldyBjb250ZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2xvYmFsVmlld1RyYW5zaXRpb25zOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogaHRteCB3aWxsIGZvcm1hdCByZXF1ZXN0cyB3aXRoIHRoZXNlIG1ldGhvZHMgYnkgZW5jb2RpbmcgdGhlaXIgcGFyYW1ldGVycyBpbiB0aGUgVVJMLCBub3QgdGhlIHJlcXVlc3QgYm9keVxuICAgICAgICogQHR5cGUgeyhIdHRwVmVyYilbXX1cbiAgICAgICAqIEBkZWZhdWx0IFsnZ2V0JywgJ2RlbGV0ZSddXG4gICAgICAgKi9cbiAgICAgIG1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zOiBbJ2dldCcsICdkZWxldGUnXSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGRpc2FibGVzIGh0bXgtYmFzZWQgcmVxdWVzdHMgdG8gbm9uLW9yaWdpbiBob3N0cy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHNlbGZSZXF1ZXN0c09ubHk6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBub3QgdXBkYXRlIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQgd2hlbiBhIHRpdGxlIHRhZyBpcyBmb3VuZCBpbiBuZXcgY29udGVudFxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgaWdub3JlVGl0bGU6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgb2YgYSBib29zdGVkIGVsZW1lbnQgaXMgc2Nyb2xsZWQgaW50byB0aGUgdmlld3BvcnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEludG9WaWV3T25Cb29zdDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNhY2hlIHRvIHN0b3JlIGV2YWx1YXRlZCB0cmlnZ2VyIHNwZWNpZmljYXRpb25zIGludG8uXG4gICAgICAgKiBZb3UgbWF5IGRlZmluZSBhIHNpbXBsZSBvYmplY3QgdG8gdXNlIGEgbmV2ZXItY2xlYXJpbmcgY2FjaGUsIG9yIGltcGxlbWVudCB5b3VyIG93biBzeXN0ZW0gdXNpbmcgYSBbcHJveHkgb2JqZWN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSlcbiAgICAgICAqIEB0eXBlIHtPYmplY3R8bnVsbH1cbiAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAqL1xuICAgICAgdHJpZ2dlclNwZWNzQ2FjaGU6IG51bGwsXG4gICAgICAvKiogQHR5cGUgYm9vbGVhbiAqL1xuICAgICAgZGlzYWJsZUluaGVyaXRhbmNlOiBmYWxzZSxcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1tdICovXG4gICAgICByZXNwb25zZUhhbmRsaW5nOiBbXG4gICAgICAgIHsgY29kZTogJzIwNCcsIHN3YXA6IGZhbHNlIH0sXG4gICAgICAgIHsgY29kZTogJ1syM10uLicsIHN3YXA6IHRydWUgfSxcbiAgICAgICAgeyBjb2RlOiAnWzQ1XS4uJywgc3dhcDogZmFsc2UsIGVycm9yOiB0cnVlIH1cbiAgICAgIF0sXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gcHJvY2VzcyBPT0Igc3dhcHMgb24gZWxlbWVudHMgdGhhdCBhcmUgbmVzdGVkIHdpdGhpbiB0aGUgbWFpbiByZXNwb25zZSBlbGVtZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd05lc3RlZE9vYlN3YXBzOiB0cnVlXG4gICAgfSxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwYXJzZUludGVydmFsfSAqL1xuICAgIHBhcnNlSW50ZXJ2YWw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgaW50ZXJuYWxFdmFsfSAqL1xuICAgIF86IG51bGwsXG4gICAgdmVyc2lvbjogJzIuMC4yJ1xuICB9XG4gIC8vIFRzYyBtYWRuZXNzIHBhcnQgMlxuICBodG14Lm9uTG9hZCA9IG9uTG9hZEhlbHBlclxuICBodG14LnByb2Nlc3MgPSBwcm9jZXNzTm9kZVxuICBodG14Lm9uID0gYWRkRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC5vZmYgPSByZW1vdmVFdmVudExpc3RlbmVySW1wbFxuICBodG14LnRyaWdnZXIgPSB0cmlnZ2VyRXZlbnRcbiAgaHRteC5hamF4ID0gYWpheEhlbHBlclxuICBodG14LmZpbmQgPSBmaW5kXG4gIGh0bXguZmluZEFsbCA9IGZpbmRBbGxcbiAgaHRteC5jbG9zZXN0ID0gY2xvc2VzdFxuICBodG14LnJlbW92ZSA9IHJlbW92ZUVsZW1lbnRcbiAgaHRteC5hZGRDbGFzcyA9IGFkZENsYXNzVG9FbGVtZW50XG4gIGh0bXgucmVtb3ZlQ2xhc3MgPSByZW1vdmVDbGFzc0Zyb21FbGVtZW50XG4gIGh0bXgudG9nZ2xlQ2xhc3MgPSB0b2dnbGVDbGFzc09uRWxlbWVudFxuICBodG14LnRha2VDbGFzcyA9IHRha2VDbGFzc0ZvckVsZW1lbnRcbiAgaHRteC5zd2FwID0gc3dhcFxuICBodG14LmRlZmluZUV4dGVuc2lvbiA9IGRlZmluZUV4dGVuc2lvblxuICBodG14LnJlbW92ZUV4dGVuc2lvbiA9IHJlbW92ZUV4dGVuc2lvblxuICBodG14LmxvZ0FsbCA9IGxvZ0FsbFxuICBodG14LmxvZ05vbmUgPSBsb2dOb25lXG4gIGh0bXgucGFyc2VJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWxcbiAgaHRteC5fID0gaW50ZXJuYWxFdmFsXG5cbiAgY29uc3QgaW50ZXJuYWxBUEkgPSB7XG4gICAgYWRkVHJpZ2dlckhhbmRsZXIsXG4gICAgYm9keUNvbnRhaW5zLFxuICAgIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSxcbiAgICBmaW5kVGhpc0VsZW1lbnQsXG4gICAgZmlsdGVyVmFsdWVzLFxuICAgIHN3YXAsXG4gICAgaGFzQXR0cmlidXRlLFxuICAgIGdldEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0TWF0Y2gsXG4gICAgZ2V0RXhwcmVzc2lvblZhcnMsXG4gICAgZ2V0SGVhZGVycyxcbiAgICBnZXRJbnB1dFZhbHVlcyxcbiAgICBnZXRJbnRlcm5hbERhdGEsXG4gICAgZ2V0U3dhcFNwZWNpZmljYXRpb24sXG4gICAgZ2V0VHJpZ2dlclNwZWNzLFxuICAgIGdldFRhcmdldCxcbiAgICBtYWtlRnJhZ21lbnQsXG4gICAgbWVyZ2VPYmplY3RzLFxuICAgIG1ha2VTZXR0bGVJbmZvLFxuICAgIG9vYlN3YXAsXG4gICAgcXVlcnlTZWxlY3RvckV4dCxcbiAgICBzZXR0bGVJbW1lZGlhdGVseSxcbiAgICBzaG91bGRDYW5jZWwsXG4gICAgdHJpZ2dlckV2ZW50LFxuICAgIHRyaWdnZXJFcnJvckV2ZW50LFxuICAgIHdpdGhFeHRlbnNpb25zXG4gIH1cblxuICBjb25zdCBWRVJCUyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCddXG4gIGNvbnN0IFZFUkJfU0VMRUNUT1IgPSBWRVJCUy5tYXAoZnVuY3Rpb24odmVyYikge1xuICAgIHJldHVybiAnW2h4LScgKyB2ZXJiICsgJ10sIFtkYXRhLWh4LScgKyB2ZXJiICsgJ10nXG4gIH0pLmpvaW4oJywgJylcblxuICBjb25zdCBIRUFEX1RBR19SRUdFWCA9IG1ha2VUYWdSZWdFeCgnaGVhZCcpXG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXRpbGl0aWVzXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge1JlZ0V4cH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VUYWdSZWdFeCh0YWcsIGdsb2JhbCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYDwke3RhZ30oXFxcXHNbXj5dKj58PikoW1xcXFxzXFxcXFNdKj8pPFxcXFwvJHt0YWd9PmAsXG4gICAgICBnbG9iYWwgPyAnZ2ltJyA6ICdpbScpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIGludGVydmFsIHN0cmluZyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBodG14IGRvZXMuIFVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IGhhdmUgdGltaW5nLXJlbGF0ZWQgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQ2F1dGlvbjogQWNjZXB0cyBhbiBpbnQgZm9sbG93ZWQgYnkgZWl0aGVyICoqcyoqIG9yICoqbXMqKi4gQWxsIG90aGVyIHZhbHVlcyB1c2UgKipwYXJzZUZsb2F0KipcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcGFyc2VJbnRlcnZhbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRpbWluZyBzdHJpbmdcbiAgICogQHJldHVybnMge251bWJlcnx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUludGVydmFsKHN0cikge1xuICAgIGlmIChzdHIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgbGV0IGludGVydmFsID0gTmFOXG4gICAgaWYgKHN0ci5zbGljZSgtMikgPT0gJ21zJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMikpXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdzJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMFxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAnbScpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDAgKiA2MFxuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNOYU4oaW50ZXJ2YWwpID8gdW5kZWZpbmVkIDogaW50ZXJ2YWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmF3QXR0cmlidXRlKGVsdCwgbmFtZSkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGVsdC5nZXRBdHRyaWJ1dGUobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIC8vIHJlc29sdmUgd2l0aCBib3RoIGh4IGFuZCBkYXRhLWh4IHByZWZpeGVzXG4gIGZ1bmN0aW9uIGhhc0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gISFlbHQuaGFzQXR0cmlidXRlICYmIChlbHQuaGFzQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpIHx8XG4gICAgICBlbHQuaGFzQXR0cmlidXRlKCdkYXRhLScgKyBxdWFsaWZpZWROYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuIGdldFJhd0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHx8IGdldFJhd0F0dHJpYnV0ZShlbHQsICdkYXRhLScgKyBxdWFsaWZpZWROYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudEVsdChlbHQpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIGlmICghcGFyZW50ICYmIGVsdC5wYXJlbnROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkgcmV0dXJuIGVsdC5wYXJlbnROb2RlXG4gICAgcmV0dXJuIHBhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICAgIHJldHVybiBkb2N1bWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtOb2RlfERvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Um9vdE5vZGUoZWx0LCBnbG9iYWwpIHtcbiAgICByZXR1cm4gZWx0LmdldFJvb3ROb2RlID8gZWx0LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IGdsb2JhbCB9KSA6IGdldERvY3VtZW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0geyhlOk5vZGUpID0+IGJvb2xlYW59IGNvbmRpdGlvblxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0TWF0Y2goZWx0LCBjb25kaXRpb24pIHtcbiAgICB3aGlsZSAoZWx0ICYmICFjb25kaXRpb24oZWx0KSkge1xuICAgICAgZWx0ID0gcGFyZW50RWx0KGVsdClcbiAgICB9XG5cbiAgICByZXR1cm4gZWx0IHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGluaXRpYWxFbGVtZW50XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gYW5jZXN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoaW5pdGlhbEVsZW1lbnQsIGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBkaXNpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1kaXNpbmhlcml0JylcbiAgICB2YXIgaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtaW5oZXJpdCcpXG4gICAgaWYgKGluaXRpYWxFbGVtZW50ICE9PSBhbmNlc3Rvcikge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmRpc2FibGVJbmhlcml0YW5jZSkge1xuICAgICAgICBpZiAoaW5oZXJpdCAmJiAoaW5oZXJpdCA9PT0gJyonIHx8IGluaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpc2luaGVyaXQgJiYgKGRpc2luaGVyaXQgPT09ICcqJyB8fCBkaXNpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICByZXR1cm4gJ3Vuc2V0J1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBsZXQgY2xvc2VzdEF0dHIgPSBudWxsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuICEhKGNsb3Nlc3RBdHRyID0gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoZWx0LCBhc0VsZW1lbnQoZSksIGF0dHJpYnV0ZU5hbWUpKVxuICAgIH0pXG4gICAgaWYgKGNsb3Nlc3RBdHRyICE9PSAndW5zZXQnKSB7XG4gICAgICByZXR1cm4gY2xvc2VzdEF0dHJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMgZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRWYXJpYWJsZVxuICAgIGNvbnN0IG1hdGNoZXNGdW5jdGlvbiA9IGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgKGVsdC5tYXRjaGVzIHx8IGVsdC5tYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWx0LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbHQub01hdGNoZXNTZWxlY3RvcilcbiAgICByZXR1cm4gISFtYXRjaGVzRnVuY3Rpb24gJiYgbWF0Y2hlc0Z1bmN0aW9uLmNhbGwoZWx0LCBzZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdGFydFRhZyhzdHIpIHtcbiAgICBjb25zdCB0YWdNYXRjaGVyID0gLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pXG4gICAgY29uc3QgbWF0Y2ggPSB0YWdNYXRjaGVyLmV4ZWMoc3RyKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSFRNTChyZXNwKSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpXG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcCwgJ3RleHQvaHRtbCcpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBlbHQpIHtcbiAgICB3aGlsZSAoZWx0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsdC5jaGlsZE5vZGVzWzBdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge0hUTUxTY3JpcHRFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZHVwbGljYXRlU2NyaXB0KHNjcmlwdCkge1xuICAgIGNvbnN0IG5ld1NjcmlwdCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICBmb3JFYWNoKHNjcmlwdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBuZXdTY3JpcHQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICB9KVxuICAgIG5ld1NjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdC50ZXh0Q29udGVudFxuICAgIG5ld1NjcmlwdC5hc3luYyA9IGZhbHNlXG4gICAgaWYgKGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlKSB7XG4gICAgICBuZXdTY3JpcHQubm9uY2UgPSBodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZVxuICAgIH1cbiAgICByZXR1cm4gbmV3U2NyaXB0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpIHtcbiAgICByZXR1cm4gc2NyaXB0Lm1hdGNoZXMoJ3NjcmlwdCcpICYmIChzY3JpcHQudHlwZSA9PT0gJ3RleHQvamF2YXNjcmlwdCcgfHwgc2NyaXB0LnR5cGUgPT09ICdtb2R1bGUnIHx8IHNjcmlwdC50eXBlID09PSAnJylcbiAgfVxuXG4gIC8qKlxuICAgKiB3ZSBoYXZlIHRvIG1ha2UgbmV3IGNvcGllcyBvZiBzY3JpcHQgdGFncyB0aGF0IHdlIGFyZSBnb2luZyB0byBpbnNlcnQgYmVjYXVzZVxuICAgKiBTT01FIGJyb3dzZXJzIChub3Qgc2F5aW5nIHdobywgYnV0IGl0IGludm9sdmVzIGFuIGVsZW1lbnQgYW5kIGFuIGFuaW1hbCkgZG9uJ3RcbiAgICogZXhlY3V0ZSBzY3JpcHRzIGNyZWF0ZWQgaW4gPHRlbXBsYXRlPiB0YWdzIHdoZW4gdGhleSBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXG4gICAqIGFuZCBhbGwgdGhlIG90aGVycyBkbyBsbWFvXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpIHtcbiAgICBBcnJheS5mcm9tKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpKS5mb3JFYWNoKC8qKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHQgKi8gKHNjcmlwdCkgPT4ge1xuICAgICAgaWYgKGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSkge1xuICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBzY3JpcHQucGFyZW50Tm9kZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3U2NyaXB0LCBzY3JpcHQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7RG9jdW1lbnRGcmFnbWVudCAmIHt0aXRsZT86IHN0cmluZ319IERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGVcbiAgICogQGRlc2NyaXB0aW9uICBhIGRvY3VtZW50IGZyYWdtZW50IHJlcHJlc2VudGluZyB0aGUgcmVzcG9uc2UgSFRNTCwgaW5jbHVkaW5nXG4gICAqIGEgYHRpdGxlYCBwcm9wZXJ0eSBmb3IgYW55IHRpdGxlIGluZm9ybWF0aW9uIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2UgSFRNTFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VGcmFnbWVudChyZXNwb25zZSkge1xuICAgIC8vIHN0cmlwIGhlYWQgdGFnIHRvIGRldGVybWluZSBzaGFwZSBvZiByZXNwb25zZSB3ZSBhcmUgZGVhbGluZyB3aXRoXG4gICAgY29uc3QgcmVzcG9uc2VXaXRoTm9IZWFkID0gcmVzcG9uc2UucmVwbGFjZShIRUFEX1RBR19SRUdFWCwgJycpXG4gICAgY29uc3Qgc3RhcnRUYWcgPSBnZXRTdGFydFRhZyhyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi9cbiAgICBsZXQgZnJhZ21lbnRcbiAgICBpZiAoc3RhcnRUYWcgPT09ICdodG1sJykge1xuICAgICAgLy8gaWYgaXQgaXMgYSBmdWxsIGRvY3VtZW50LCBwYXJzZSBpdCBhbmQgcmV0dXJuIHRoZSBib2R5XG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIGlmIChzdGFydFRhZyA9PT0gJ2JvZHknKSB7XG4gICAgICAvLyBwYXJzZSBib2R5IHcvbyB3cmFwcGluZyBpbiB0ZW1wbGF0ZVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgbm9uLWJvZHkgcGFydGlhbCBIVE1MIGNvbnRlbnQsIHNvIHdyYXAgaXQgaW4gYSB0ZW1wbGF0ZSB0byBtYXhpbWl6ZSBwYXJzaW5nIGZsZXhpYmlsaXR5XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwoJzxib2R5Pjx0ZW1wbGF0ZSBjbGFzcz1cImludGVybmFsLWh0bXgtd3JhcHBlclwiPicgKyByZXNwb25zZVdpdGhOb0hlYWQgKyAnPC90ZW1wbGF0ZT48L2JvZHk+JylcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKGRvYy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpLmNvbnRlbnQpXG4gICAgICAvLyBleHRyYWN0IHRpdGxlIGludG8gZnJhZ21lbnQgZm9yIGxhdGVyIHByb2Nlc3NpbmdcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG5cbiAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyB3ZSBzdXBwb3J0IGEgdGl0bGUgdGFnIGF0IHRoZSByb290IGxldmVsIG9mIG5vbi1ib2R5IHJlc3BvbnNlcywgc28gd2UgbmVlZCB0byBoYW5kbGUgaXRcbiAgICAgIHZhciB0aXRsZUVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbGVtZW50ICYmIHRpdGxlRWxlbWVudC5wYXJlbnROb2RlID09PSBmcmFnbWVudCkge1xuICAgICAgICB0aXRsZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgICAgZnJhZ21lbnQudGl0bGUgPSB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93U2NyaXB0VGFncykge1xuICAgICAgICBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBzY3JpcHQgdGFncyBpZiBzY3JpcHRzIGFyZSBkaXNhYmxlZFxuICAgICAgICBmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKS5mb3JFYWNoKChzY3JpcHQpID0+IHNjcmlwdC5yZW1vdmUoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVDYWxsKGZ1bmMpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgZnVuYygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBpc1R5cGUobywgdHlwZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIEZ1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIE9iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUmF3T2JqZWN0KG8pIHtcbiAgICByZXR1cm4gaXNUeXBlKG8sICdPYmplY3QnKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9uSGFuZGxlclxuICAgKiBAcHJvcGVydHkgeyhrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwKXxzdHJpbmd9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RlbmVySW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IG9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14Tm9kZUludGVybmFsRGF0YVxuICAgKiBFbGVtZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbml0SGFzaF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYm9vc3RlZF1cbiAgICogQHByb3BlcnR5IHtPbkhhbmRsZXJbXX0gW29uSGFuZGxlcnNdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHByb3BlcnR5IHtMaXN0ZW5lckluZm9bXX0gW2xpc3RlbmVySW5mb3NdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhbmNlbGxlZF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdHJpZ2dlcmVkT25jZV1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheWVkXVxuICAgKiBAcHJvcGVydHkge251bWJlcnxudWxsfSBbdGhyb3R0bGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFzdFZhbHVlXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2FkZWRdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJiXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwb2xsaW5nXVxuICAgKiBAcHJvcGVydHkge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8bnVsbH0gW2xhc3RCdXR0b25DbGlja2VkXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3JlcXVlc3RDb3VudF1cbiAgICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0gW3hocl1cbiAgICogQHByb3BlcnR5IHsoKCkgPT4gdm9pZClbXX0gW3F1ZXVlZFJlcXVlc3RzXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthYm9ydGFibGVdXG4gICAqXG4gICAqIEV2ZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IFt0cmlnZ2VyU3BlY11cbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldFtdfSBbaGFuZGxlZEZvcl1cbiAgICovXG5cbiAgLyoqXG4gICAqIGdldEludGVybmFsRGF0YSByZXRyaWV2ZXMgXCJwcml2YXRlXCIgZGF0YSBzdG9yZWQgYnkgaHRteCB3aXRoaW4gYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEV2ZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxEYXRhKGVsdCkge1xuICAgIGNvbnN0IGRhdGFQcm9wID0gJ2h0bXgtaW50ZXJuYWwtZGF0YSdcbiAgICBsZXQgZGF0YSA9IGVsdFtkYXRhUHJvcF1cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGRhdGEgPSBlbHRbZGF0YVByb3BdID0ge31cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0FycmF5IGNvbnZlcnRzIGFuIEFycmF5TGlrZSBvYmplY3QgaW50byBhIHJlYWwgYXJyYXkuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHJldHVybnMge1RbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkoYXJyKSB7XG4gICAgY29uc3QgcmV0dXJuQXJyID0gW11cbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXR1cm5BcnIucHVzaChhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5BcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1RbXXxOYW1lZE5vZGVNYXB8SFRNTENvbGxlY3Rpb258SFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb258QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHBhcmFtIHsoVCkgPT4gdm9pZH0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gZm9yRWFjaChhcnIsIGZ1bmMpIHtcbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBmdW5jKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsZWRJbnRvVmlldyhlbCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGVsZW1Ub3AgPSByZWN0LnRvcFxuICAgIGNvbnN0IGVsZW1Cb3R0b20gPSByZWN0LmJvdHRvbVxuICAgIHJldHVybiBlbGVtVG9wIDwgd2luZG93LmlubmVySGVpZ2h0ICYmIGVsZW1Cb3R0b20gPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gYm9keUNvbnRhaW5zKGVsdCkge1xuICAgIC8vIElFIEZpeFxuICAgIGNvbnN0IHJvb3ROb2RlID0gZWx0LmdldFJvb3ROb2RlICYmIGVsdC5nZXRSb290Tm9kZSgpXG4gICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QpIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMocm9vdE5vZGUuaG9zdClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHNwbGl0T25XaGl0ZXNwYWNlKHRyaWdnZXIpIHtcbiAgICByZXR1cm4gdHJpZ2dlci50cmltKCkuc3BsaXQoL1xccysvKVxuICB9XG5cbiAgLyoqXG4gICAqIG1lcmdlT2JqZWN0cyB0YWtlcyBhbGwgdGhlIGtleXMgZnJvbVxuICAgKiBvYmoyIGFuZCBkdXBsaWNhdGVzIHRoZW0gaW50byBvYmoxXG4gICAqIEB0ZW1wbGF0ZSBUMVxuICAgKiBAdGVtcGxhdGUgVDJcbiAgICogQHBhcmFtIHtUMX0gb2JqMVxuICAgKiBAcGFyYW0ge1QyfSBvYmoyXG4gICAqIEByZXR1cm5zIHtUMSAmIFQyfVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmoyKSB7XG4gICAgICBpZiAob2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgcmV0dXJuIG9iajFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30galN0cmluZ1xuICAgKiBAcmV0dXJucyB7YW55fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUpTT04oalN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShqU3RyaW5nKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dFcnJvcihlcnJvcilcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkge1xuICAgIGNvbnN0IHRlc3QgPSAnaHRteDpsb2NhbFN0b3JhZ2VUZXN0J1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KVxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoKVxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBwYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCB1bmxlc3MgaW5kZXggcGFnZVxuICAgICAgaWYgKCEoL15cXC8kLy50ZXN0KHBhdGgpKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBiZSBraW5kIHRvIElFMTEsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBVUkwoKVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHVibGljIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gaW50ZXJuYWxFdmFsKHN0cikge1xuICAgIHJldHVybiBtYXliZUV2YWwoZ2V0RG9jdW1lbnQoKS5ib2R5LCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBldmFsKHN0cilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjYWxsYmFjayBmb3IgdGhlICoqaHRteDpsb2FkKiogZXZlbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvY2VzcyBuZXcgY29udGVudCwgZm9yIGV4YW1wbGUgaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50IHdpdGggYSBqYXZhc2NyaXB0IGxpYnJhcnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25Mb2FkXG4gICAqXG4gICAqIEBwYXJhbSB7KGVsdDogTm9kZSkgPT4gdm9pZH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGNhbGwgb24gbmV3bHkgbG9hZGVkIGNvbnRlbnRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvbkxvYWRIZWxwZXIoY2FsbGJhY2spIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0bXgub24oJ2h0bXg6bG9hZCcsIC8qKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldnQgKi8gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjYWxsYmFjayhldnQuZGV0YWlsLmVsdClcbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIExvZyBhbGwgaHRteCBldmVudHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dBbGxcbiAgICovXG4gIGZ1bmN0aW9uIGxvZ0FsbCgpIHtcbiAgICBodG14LmxvZ2dlciA9IGZ1bmN0aW9uKGVsdCwgZXZlbnQsIGRhdGEpIHtcbiAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LCBlbHQsIGRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nTm9uZSgpIHtcbiAgICBodG14LmxvZ2dlciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudCBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZEFsbFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudHMgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD59XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQWxsKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRBbGwoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgV2luZG93XG4gICAqL1xuICBmdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHdpbmRvd1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsdCwgZGVsYXkpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUVsZW1lbnQoZWx0KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RWx0KGVsdCkucmVtb3ZlQ2hpbGQoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0h0bWxFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqIEByZXR1cm4ge1BhcmVudE5vZGV8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzUGFyZW50Tm9kZShlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFkZHMgYSBjbGFzcyB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWRkQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgY2xhc3MgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byBhZGRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSBjbGFzcyBpcyBhZGRlZFxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eiwgZGVsYXkpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0LmNsYXNzTGlzdCAmJiBlbHQuY2xhc3NMaXN0LmFkZChjbGF6eilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsYXNzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gbm9kZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgY2xhc3MgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgY2xhc3MgaXMgcmVtb3ZlZClcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQobm9kZSwgY2xhenosIGRlbGF5KSB7XG4gICAgbGV0IGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KG5vZGUpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShjbGF6eilcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGNsYXNzZXMgbGVmdCwgcmVtb3ZlIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGdpdmVuIGNsYXNzIG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdG9nZ2xlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRvZ2dsZSB0aGUgY2xhc3Mgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0b2dnbGVcbiAgICovXG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzT25FbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBlbHQuY2xhc3NMaXN0LnRvZ2dsZShjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSBpdHMgc2libGluZ3MsIHNvIHRoYXQgYW1vbmcgaXRzIHNpYmxpbmdzLCBvbmx5IHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Rha2VDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRha2UgdGhlIGNsYXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdGFrZVxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNsYXNzRm9yRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZm9yRWFjaChlbHQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXp6KVxuICAgIH0pXG4gICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGVsdCksIGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjbG9zZXN0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzIHBhcmVudGFnZSwgaW5jbHVzaXZlIG9mIHRoZSBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2Nsb3Nlc3RcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIHNlbGVjdG9yIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBmaW5kXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZXN0KGVsdCwgc2VsZWN0b3IpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmIChlbHQgJiYgZWx0LmNsb3Nlc3QpIHtcbiAgICAgIHJldHVybiBlbHQuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyByZW1vdmUgd2hlbiBJRSBnb2VzIGF3YXlcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGVsdCA9PSBudWxsIHx8IG1hdGNoZXMoZWx0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbHQgPSBlbHQgJiYgYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSlcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwcmVmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzdWZmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgPT09IHN1ZmZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICBjb25zdCB0cmltbWVkU2VsZWN0b3IgPSBzZWxlY3Rvci50cmltKClcbiAgICBpZiAoc3RhcnRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICc8JykgJiYgZW5kc1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnLz4nKSkge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3Rvci5zdWJzdHJpbmcoMSwgdHJpbW1lZFNlbGVjdG9yLmxlbmd0aCAtIDIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfEVsZW1lbnR8RG9jdW1lbnR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLCBnbG9iYWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoc2VsZWN0b3IuaW5kZXhPZignY2xvc2VzdCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtjbG9zZXN0KGFzRWxlbWVudChlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOCkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2ZpbmQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbZmluZChhc1BhcmVudE5vZGUoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ25leHQnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLm5leHRFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ25leHQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkZvcndhcmRRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncHJldmlvdXMnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdwcmV2aW91cyAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuQmFja3dhcmRzUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudF1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnd2luZG93Jykge1xuICAgICAgcmV0dXJuIFt3aW5kb3ddXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2JvZHknKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50LmJvZHldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3Jvb3QnKSB7XG4gICAgICByZXR1cm4gW2dldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZ2xvYmFsICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLnNsaWNlKDcpLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdG9BcnJheShhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkZvcndhcmRRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5CYWNrd2FyZHNRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd31cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3RvcilbMF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZ2V0RG9jdW1lbnQoKS5ib2R5LCBlbHRPclNlbGVjdG9yKVswXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge0V2ZW50VGFyZ2V0fSBUXG4gICAqIEBwYXJhbSB7VHxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtUfSBbY29udGV4dF1cbiAgICogQHJldHVybnMge0VsZW1lbnR8VHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVRhcmdldChlbHRPclNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZpbmQoYXNQYXJlbnROb2RlKGNvbnRleHQpIHx8IGRvY3VtZW50LCBlbHRPclNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7a2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcHxzdHJpbmd9IEFueUV2ZW50TmFtZVxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXZlbnRBcmdzXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICAgKiBAcHJvcGVydHkge0FueUV2ZW50TmFtZX0gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxBbnlFdmVudE5hbWV9IGFyZzFcbiAgICogQHBhcmFtIHtBbnlFdmVudE5hbWV8RXZlbnRMaXN0ZW5lcn0gYXJnMlxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXVxuICAgKiBAcmV0dXJucyB7RXZlbnRBcmdzfVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oYXJnMikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogZ2V0RG9jdW1lbnQoKS5ib2R5LFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMSksXG4gICAgICAgIGxpc3RlbmVyOiBhcmcyXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogcmVzb2x2ZVRhcmdldChhcmcxKSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzIpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnM1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBsaXN0ZW5lciB0byB8IHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3IgfCB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICBjb25zdCBiID0gaXNGdW5jdGlvbihhcmcyKVxuICAgIHJldHVybiBiID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvZmZcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oYXJnMikgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTm9kZSBwcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3QgRFVNTVlfRUxUID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdvdXRwdXQnKSAvLyBkdW1teSBlbGVtZW50IGZvciBiYWQgc2VsZWN0b3JzXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ck5hbWVcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgYXR0ck5hbWUpIHtcbiAgICBjb25zdCBhdHRyVGFyZ2V0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0ck5hbWUpXG4gICAgaWYgKGF0dHJUYXJnZXQpIHtcbiAgICAgIGlmIChhdHRyVGFyZ2V0ID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIFtmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyTmFtZSldXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgYXR0clRhcmdldClcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsb2dFcnJvcignVGhlIHNlbGVjdG9yIFwiJyArIGF0dHJUYXJnZXQgKyAnXCIgb24gJyArIGF0dHJOYW1lICsgJyByZXR1cm5lZCBubyBtYXRjaGVzIScpXG4gICAgICAgICAgcmV0dXJuIFtEVU1NWV9FTFRdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBhc0VsZW1lbnQoZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoYXNFbGVtZW50KGVsdCksIGF0dHJpYnV0ZSkgIT0gbnVsbFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VGFyZ2V0KGVsdCkge1xuICAgIGNvbnN0IHRhcmdldFN0ciA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKVxuICAgIGlmICh0YXJnZXRTdHIpIHtcbiAgICAgIGlmICh0YXJnZXRTdHIgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRhcmdldFN0cilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAoZGF0YS5ib29zdGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUobmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXNUb1NldHRsZSA9IGh0bXguY29uZmlnLmF0dHJpYnV0ZXNUb1NldHRsZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlc1RvU2V0dGxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmFtZSA9PT0gYXR0cmlidXRlc1RvU2V0dGxlW2ldKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VUb1xuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlRnJvbVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvbmVBdHRyaWJ1dGVzKG1lcmdlVG8sIG1lcmdlRnJvbSkge1xuICAgIGZvckVhY2gobWVyZ2VUby5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoIW1lcmdlRnJvbS5oYXNBdHRyaWJ1dGUoYXR0ci5uYW1lKSAmJiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKG1lcmdlRnJvbS5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpIHtcbiAgICBjb25zdCBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyh0YXJnZXQpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzSW5saW5lU3dhcChzd2FwU3R5bGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFN0eWxlID09PSAnb3V0ZXJIVE1MJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvb2JWYWx1ZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9vYkVsZW1lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGxldCBzZWxlY3RvciA9ICcjJyArIGdldFJhd0F0dHJpYnV0ZShvb2JFbGVtZW50LCAnaWQnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFN0eWxlICovXG4gICAgbGV0IHN3YXBTdHlsZSA9ICdvdXRlckhUTUwnXG4gICAgaWYgKG9vYlZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKG9vYlZhbHVlLmluZGV4T2YoJzonKSA+IDApIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlLnN1YnN0cigwLCBvb2JWYWx1ZS5pbmRleE9mKCc6JykpXG4gICAgICBzZWxlY3RvciA9IG9vYlZhbHVlLnN1YnN0cihvb2JWYWx1ZS5pbmRleE9mKCc6JykgKyAxLCBvb2JWYWx1ZS5sZW5ndGgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICBpZiAodGFyZ2V0cykge1xuICAgICAgZm9yRWFjaChcbiAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgICAgbGV0IGZyYWdtZW50XG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudENsb25lID0gb29iRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICBmcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQob29iRWxlbWVudENsb25lKVxuICAgICAgICAgIGlmICghaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBhc1BhcmVudE5vZGUob29iRWxlbWVudENsb25lKSAvLyBpZiB0aGlzIGlzIG5vdCBhbiBpbmxpbmUgc3dhcCwgd2UgdXNlIHRoZSBjb250ZW50IG9mIHRoZSBub2RlLCBub3QgdGhlIG5vZGUgaXRzZWxmXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlU3dhcERldGFpbHMgPSB7IHNob3VsZFN3YXA6IHRydWUsIHRhcmdldCwgZnJhZ21lbnQgfVxuICAgICAgICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6b29iQmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICAgICAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgICAgICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgICAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCB0YXJnZXQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14Om9vYkFmdGVyU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6b29iRXJyb3JOb1RhcmdldCcsIHsgY29udGVudDogb29iRWxlbWVudCB9KVxuICAgIH1cbiAgICByZXR1cm4gb29iVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudCkge1xuICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ1toeC1wcmVzZXJ2ZV0sIFtkYXRhLWh4LXByZXNlcnZlXScpLCBmdW5jdGlvbihwcmVzZXJ2ZWRFbHQpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0QXR0cmlidXRlVmFsdWUocHJlc2VydmVkRWx0LCAnaWQnKVxuICAgICAgY29uc3Qgb2xkRWx0ID0gZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgIGlmIChvbGRFbHQgIT0gbnVsbCkge1xuICAgICAgICBwcmVzZXJ2ZWRFbHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQob2xkRWx0LCBwcmVzZXJ2ZWRFbHQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyksIGZ1bmN0aW9uKG5ld05vZGUpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UmF3QXR0cmlidXRlKG5ld05vZGUsICdpZCcpXG4gICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkSWQgPSBpZC5yZXBsYWNlKFwiJ1wiLCBcIlxcXFwnXCIpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYWcgPSBuZXdOb2RlLnRhZ05hbWUucmVwbGFjZSgnOicsICdcXFxcOicpXG4gICAgICAgIGNvbnN0IHBhcmVudEVsdCA9IGFzUGFyZW50Tm9kZShwYXJlbnROb2RlKVxuICAgICAgICBjb25zdCBvbGROb2RlID0gcGFyZW50RWx0ICYmIHBhcmVudEVsdC5xdWVyeVNlbGVjdG9yKG5vcm1hbGl6ZWRUYWcgKyBcIltpZD0nXCIgKyBub3JtYWxpemVkSWQgKyBcIiddXCIpXG4gICAgICAgIGlmIChvbGROb2RlICYmIG9sZE5vZGUgIT09IHBhcmVudEVsdCkge1xuICAgICAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBuZXdOb2RlLmNsb25lTm9kZSgpXG4gICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG9sZE5vZGUpXG4gICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG5ld0F0dHJpYnV0ZXMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBjaGlsZFxuICAgKiBAcmV0dXJucyB7SHRteFNldHRsZVRhc2t9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlQWpheExvYWRUYXNrKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHByb2Nlc3NOb2RlKGFzRWxlbWVudChjaGlsZCkpXG4gICAgICBwcm9jZXNzRm9jdXMoYXNQYXJlbnROb2RlKGNoaWxkKSlcbiAgICAgIHRyaWdnZXJFdmVudChjaGlsZCwgJ2h0bXg6bG9hZCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gY2hpbGRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NGb2N1cyhjaGlsZCkge1xuICAgIGNvbnN0IGF1dG9mb2N1cyA9ICdbYXV0b2ZvY3VzXSdcbiAgICBjb25zdCBhdXRvRm9jdXNlZEVsdCA9IGFzSHRtbEVsZW1lbnQobWF0Y2hlcyhjaGlsZCwgYXV0b2ZvY3VzKSA/IGNoaWxkIDogY2hpbGQucXVlcnlTZWxlY3RvcihhdXRvZm9jdXMpKVxuICAgIGlmIChhdXRvRm9jdXNlZEVsdCAhPSBudWxsKSB7XG4gICAgICBhdXRvRm9jdXNlZEVsdC5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge05vZGV9IGluc2VydEJlZm9yZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydEJlZm9yZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIHdoaWxlIChmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZFxuICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGNoaWxkKSwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbnNlcnRCZWZvcmUpXG4gICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJhc2VkIG9uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2h5YW1hbW90by9mZDQzNTUwNWQyOWViZmEzZDk3MTZmZDJiZThkNDJmMCxcbiAgICogZGVyaXZlZCBmcm9tIEphdmEncyBzdHJpbmcgaGFzaGNvZGUgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaGFzaFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nSGFzaChzdHJpbmcsIGhhc2gpIHtcbiAgICBsZXQgY2hhciA9IDBcbiAgICB3aGlsZSAoY2hhciA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBzdHJpbmcuY2hhckNvZGVBdChjaGFyKyspIHwgMCAvLyBiaXR3aXNlIG9yIGVuc3VyZXMgd2UgaGF2ZSBhIDMyLWJpdCBpbnRcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYXR0cmlidXRlSGFzaChlbHQpIHtcbiAgICBsZXQgaGFzaCA9IDBcbiAgICAvLyBJRSBmaXhcbiAgICBpZiAoZWx0LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWx0LmF0dHJpYnV0ZXNbaV1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZS52YWx1ZSkgeyAvLyBvbmx5IGluY2x1ZGUgYXR0cmlidXRlcyB3LyBhY3R1YWwgdmFsdWVzIChlbXB0eSBpcyBzYW1lIGFzIG5vbi1leGlzdGVudClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUubmFtZSwgaGFzaClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUudmFsdWUsIGhhc2gpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE9uSGFuZGxlcnMoZWx0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZm8gPSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1tpXVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChlbHQsIGhhbmRsZXJJbmZvLmV2ZW50LCBoYW5kbGVySW5mby5saXN0ZW5lcilcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE5vZGUoZWxlbWVudCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbGVtZW50KVxuICAgIGlmIChpbnRlcm5hbERhdGEudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVybmFsRGF0YS50aW1lb3V0KVxuICAgIH1cbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MpIHtcbiAgICAgIGZvckVhY2goaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MsIGZ1bmN0aW9uKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8ub24pIHtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChpbmZvLm9uLCBpbmZvLnRyaWdnZXIsIGluZm8ubGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWxlbWVudClcbiAgICBmb3JFYWNoKE9iamVjdC5rZXlzKGludGVybmFsRGF0YSksIGZ1bmN0aW9uKGtleSkgeyBkZWxldGUgaW50ZXJuYWxEYXRhW2tleV0gfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuVXBFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKVxuICAgIGRlSW5pdE5vZGUoZWxlbWVudClcbiAgICAvLyBAdHMtaWdub3JlIElFMTEgY29kZVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikgeyAvLyBJRVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yRWFjaChlbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkgeyBjbGVhblVwRWxlbWVudChjaGlsZCkgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiB0YXJnZXQudGFnTmFtZSA9PT0gJ0JPRFknKSB7IC8vIHNwZWNpYWwgY2FzZSB0aGUgYm9keSB0byBpbm5lckhUTUwgYmVjYXVzZSBEb2N1bWVudEZyYWdtZW50cyBjYW4ndCBjb250YWluIGEgYm9keSBlbHQgdW5mb3J0dW5hdGVseVxuICAgICAgcmV0dXJuIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtOb2RlfSAqL1xuICAgIGxldCBuZXdFbHRcbiAgICBjb25zdCBlbHRCZWZvcmVOZXdDb250ZW50ID0gdGFyZ2V0LnByZXZpb3VzU2libGluZ1xuICAgIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChlbHRCZWZvcmVOZXdDb250ZW50ID09IG51bGwpIHtcbiAgICAgIG5ld0VsdCA9IHBhcmVudEVsdCh0YXJnZXQpLmZpcnN0Q2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWx0ID0gZWx0QmVmb3JlTmV3Q29udGVudC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBzZXR0bGVJbmZvLmVsdHMgPSBzZXR0bGVJbmZvLmVsdHMuZmlsdGVyKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUgIT09IHRhcmdldCB9KVxuICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgbmV3bHkgYWRkZWQgY29udGVudCBhbmQgYWRkIGFsbCBlbGVtZW50cyB0byB0aGUgc2V0dGxlIGluZm8gc28gd2UgdHJpZ2dlclxuICAgIC8vIGV2ZW50cyBwcm9wZXJseSBvbiB0aGVtXG4gICAgd2hpbGUgKG5ld0VsdCAmJiBuZXdFbHQgIT09IHRhcmdldCkge1xuICAgICAgaWYgKG5ld0VsdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgc2V0dGxlSW5mby5lbHRzLnB1c2gobmV3RWx0KVxuICAgICAgfVxuICAgICAgbmV3RWx0ID0gbmV3RWx0Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGFyZ2V0LnJlbW92ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgdGFyZ2V0LmZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBudWxsLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQubmV4dFNpYmxpbmcsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqL1xuICBmdW5jdGlvbiBzd2FwRGVsZXRlKHRhcmdldCkge1xuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICByZXR1cm4gcGFyZW50RWx0KHRhcmdldCkucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgY29uc3QgZmlyc3RDaGlsZCA9IHRhcmdldC5maXJzdENoaWxkXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBmaXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgd2hpbGUgKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICB9XG4gICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkKVxuICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHN3aXRjaCAoc3dhcFN0eWxlKSB7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdvdXRlckhUTUwnOlxuICAgICAgICBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJiZWdpbic6XG4gICAgICAgIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlYmVnaW4nOlxuICAgICAgICBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmVlbmQnOlxuICAgICAgICBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJlbmQnOlxuICAgICAgICBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBzd2FwRGVsZXRlKHRhcmdldClcbiAgICAgICAgcmV0dXJuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMoZWx0KVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBleHRlbnNpb25zW2ldXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZXh0LmhhbmRsZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0VsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGhhbmRsZVN3YXAgcmV0dXJucyBhbiBhcnJheSAobGlrZSkgb2YgZWxlbWVudHMsIHdlIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdFbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBuZXdFbGVtZW50c1tqXVxuICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3dhcFN0eWxlID09PSAnaW5uZXJIVE1MJykge1xuICAgICAgICAgIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2FwV2l0aFN0eWxlKGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICB2YXIgb29iRWx0cyA9IGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtc3dhcC1vb2JdLCBbZGF0YS1oeC1zd2FwLW9vYl0nKVxuICAgIGZvckVhY2gob29iRWx0cywgZnVuY3Rpb24ob29iRWxlbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93TmVzdGVkT29iU3dhcHMgfHwgb29iRWxlbWVudC5wYXJlbnRFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG9vYlZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUob29iRWxlbWVudCwgJ2h4LXN3YXAtb29iJylcbiAgICAgICAgaWYgKG9vYlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaHgtc3dhcC1vb2InKVxuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oeC1zd2FwLW9vYicpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gb29iRWx0cy5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBjb21wbGV0ZSBzd2FwcGluZyBwaXBlbGluZSwgaW5jbHVkaW5nOiBmb2N1cyBhbmQgc2VsZWN0aW9uIHByZXNlcnZhdGlvbixcbiAgICogdGl0bGUgdXBkYXRlcywgc2Nyb2xsLCBPT0Igc3dhcHBpbmcsIG5vcm1hbCBzd2FwcGluZyBhbmQgc2V0dGxpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKiBAcGFyYW0ge1N3YXBPcHRpb25zfSBbc3dhcE9wdGlvbnNdXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwKHRhcmdldCwgY29udGVudCwgc3dhcFNwZWMsIHN3YXBPcHRpb25zKSB7XG4gICAgaWYgKCFzd2FwT3B0aW9ucykge1xuICAgICAgc3dhcE9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIHRhcmdldCA9IHJlc29sdmVUYXJnZXQodGFyZ2V0KVxuXG4gICAgLy8gcHJlc2VydmUgZm9jdXMgYW5kIHNlbGVjdGlvblxuICAgIGNvbnN0IGFjdGl2ZUVsdCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICBsZXQgc2VsZWN0aW9uSW5mbyA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIHNlbGVjdGlvbkluZm8gPSB7XG4gICAgICAgIGVsdDogYWN0aXZlRWx0LFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXJ0OiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uU3RhcnQgOiBudWxsLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVuZDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvbkVuZCA6IG51bGxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzYWZhcmkgaXNzdWUgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9wbGF5d3JpZ2h0L2lzc3Vlcy81ODk0XG4gICAgfVxuICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpXG5cbiAgICAvLyBGb3IgdGV4dCBjb250ZW50IHN3YXBzLCBkb24ndCBwYXJzZSB0aGUgcmVzcG9uc2UgYXMgSFRNTCwganVzdCBpbnNlcnQgaXRcbiAgICBpZiAoc3dhcFNwZWMuc3dhcFN0eWxlID09PSAndGV4dENvbnRlbnQnKSB7XG4gICAgICB0YXJnZXQudGV4dENvbnRlbnQgPSBjb250ZW50XG4gICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBmcmFnbWVudCBhbmQgcHJvY2VzcyBpdFxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY29udGVudClcblxuICAgICAgc2V0dGxlSW5mby50aXRsZSA9IGZyYWdtZW50LnRpdGxlXG5cbiAgICAgIC8vIHNlbGVjdC1vb2Igc3dhcHNcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3RPT0IpIHtcbiAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWVzID0gc3dhcE9wdGlvbnMuc2VsZWN0T09CLnNwbGl0KCcsJylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvb2JTZWxlY3RWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlc1tpXS5zcGxpdCgnOicsIDIpXG4gICAgICAgICAgbGV0IGlkID0gb29iU2VsZWN0VmFsdWVbMF0udHJpbSgpXG4gICAgICAgICAgaWYgKGlkLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcoMSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBvb2JTZWxlY3RWYWx1ZVsxXSB8fCAndHJ1ZSdcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignIycgKyBpZClcbiAgICAgICAgICBpZiAob29iRWxlbWVudCkge1xuICAgICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9vYiBzd2Fwc1xuICAgICAgZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ3RlbXBsYXRlJyksIC8qKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlICovZnVuY3Rpb24odGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGZpbmRBbmRTd2FwT29iRWxlbWVudHModGVtcGxhdGUuY29udGVudCwgc2V0dGxlSW5mbykpIHtcbiAgICAgICAgICAvLyBBdm9pZCBwb2xsdXRpbmcgdGhlIERPTSB3aXRoIGVtcHR5IHRlbXBsYXRlcyB0aGF0IHdlcmUgb25seSB1c2VkIHRvIGVuY2Fwc3VsYXRlIG9vYiBzd2FwXG4gICAgICAgICAgdGVtcGxhdGUucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gbm9ybWFsIHN3YXBcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3QpIHtcbiAgICAgICAgY29uc3QgbmV3RnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3dhcE9wdGlvbnMuc2VsZWN0KSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIG5ld0ZyYWdtZW50LmFwcGVuZENoaWxkKG5vZGUpXG4gICAgICAgIH0pXG4gICAgICAgIGZyYWdtZW50ID0gbmV3RnJhZ21lbnRcbiAgICAgIH1cbiAgICAgIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KVxuICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3BlYy5zd2FwU3R5bGUsIHN3YXBPcHRpb25zLmNvbnRleHRFbGVtZW50LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cblxuICAgIC8vIGFwcGx5IHNhdmVkIGZvY3VzIGFuZCBzZWxlY3Rpb24gaW5mb3JtYXRpb24gdG8gc3dhcHBlZCBjb250ZW50XG4gICAgaWYgKHNlbGVjdGlvbkluZm8uZWx0ICYmXG4gICAgICAhYm9keUNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZWx0KSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSkge1xuICAgICAgY29uc3QgbmV3QWN0aXZlRWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSlcbiAgICAgIGNvbnN0IGZvY3VzT3B0aW9ucyA9IHsgcHJldmVudFNjcm9sbDogc3dhcFNwZWMuZm9jdXNTY3JvbGwgIT09IHVuZGVmaW5lZCA/ICFzd2FwU3BlYy5mb2N1c1Njcm9sbCA6ICFodG14LmNvbmZpZy5kZWZhdWx0Rm9jdXNTY3JvbGwgfVxuICAgICAgaWYgKG5ld0FjdGl2ZUVsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChzZWxlY3Rpb25JbmZvLnN0YXJ0ICYmIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uSW5mby5zdGFydCwgc2VsZWN0aW9uSW5mby5lbmQpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdGhlIHNldFNlbGVjdGlvblJhbmdlIG1ldGhvZCBpcyBwcmVzZW50IG9uIGZpZWxkcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQsIHNvIGp1c3QgbGV0IHRoaXMgZmFpbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdBY3RpdmVFbHQuZm9jdXMoZm9jdXNPcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG4gICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU3dhcCcsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICB9KVxuICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaykge1xuICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2soKVxuICAgIH1cblxuICAgIC8vIG1lcmdlIGluIG5ldyB0aXRsZSBhZnRlciBzd2FwIGJ1dCBiZWZvcmUgc2V0dGxlXG4gICAgaWYgKCFzd2FwU3BlYy5pZ25vcmVUaXRsZSkge1xuICAgICAgaGFuZGxlVGl0bGUoc2V0dGxlSW5mby50aXRsZSlcbiAgICB9XG5cbiAgICAvLyBzZXR0bGVcbiAgICBjb25zdCBkb1NldHRsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLnRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgIHRhc2suY2FsbCgpXG4gICAgICB9KVxuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTZXR0bGUnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgICB9KVxuXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYW5jaG9yKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclRhcmdldCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KCcjJyArIHN3YXBPcHRpb25zLmFuY2hvcikpXG4gICAgICAgIGlmIChhbmNob3JUYXJnZXQpIHtcbiAgICAgICAgICBhbmNob3JUYXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6ICdhdXRvJyB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVNjcm9sbFN0YXRlKHNldHRsZUluZm8uZWx0cywgc3dhcFNwZWMpXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaykge1xuICAgICAgICBzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3dhcFNwZWMuc2V0dGxlRGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU2V0dGxlLCBzd2FwU3BlYy5zZXR0bGVEZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TZXR0bGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCBoZWFkZXIsIGVsdCkge1xuICAgIGNvbnN0IHRyaWdnZXJCb2R5ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlcilcbiAgICBpZiAodHJpZ2dlckJvZHkuaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICBjb25zdCB0cmlnZ2VycyA9IHBhcnNlSlNPTih0cmlnZ2VyQm9keSlcbiAgICAgIGZvciAoY29uc3QgZXZlbnROYW1lIGluIHRyaWdnZXJzKSB7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgICAgbGV0IGRldGFpbCA9IHRyaWdnZXJzW2V2ZW50TmFtZV1cbiAgICAgICAgICBpZiAoaXNSYXdPYmplY3QoZGV0YWlsKSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWx0ID0gZGV0YWlsLnRhcmdldCAhPT0gdW5kZWZpbmVkID8gZGV0YWlsLnRhcmdldCA6IGVsdFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRhaWwgPSB7IHZhbHVlOiBkZXRhaWwgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBldmVudE5hbWVzID0gdHJpZ2dlckJvZHkuc3BsaXQoJywnKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZXNbaV0udHJpbSgpLCBbXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBXSElURVNQQUNFID0gL1xccy9cbiAgY29uc3QgV0hJVEVTUEFDRV9PUl9DT01NQSA9IC9bXFxzLF0vXG4gIGNvbnN0IFNZTUJPTF9TVEFSVCA9IC9bXyRhLXpBLVpdL1xuICBjb25zdCBTWU1CT0xfQ09OVCA9IC9bXyRhLXpBLVowLTldL1xuICBjb25zdCBTVFJJTkdJU0hfU1RBUlQgPSBbJ1wiJywgXCInXCIsICcvJ11cbiAgY29uc3QgTk9UX1dISVRFU1BBQ0UgPSAvW15cXHNdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVCA9IC9beyhdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQgPSAvW30pXS9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZVN0cmluZyhzdHIpIHtcbiAgICAvKiogQHR5cGUgc3RyaW5nW10gKi9cbiAgICBjb25zdCB0b2tlbnMgPSBbXVxuICAgIGxldCBwb3NpdGlvbiA9IDBcbiAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoKSB7XG4gICAgICBpZiAoU1lNQk9MX1NUQVJULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbikpKSB7XG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgd2hpbGUgKFNZTUJPTF9DT05ULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbiArIDEpKSkge1xuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIGlmIChTVFJJTkdJU0hfU1RBUlQuaW5kZXhPZihzdHIuY2hhckF0KHBvc2l0aW9uKSkgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2hhciA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoICYmIHN0ci5jaGFyQXQocG9zaXRpb24pICE9PSBzdGFydENoYXIpIHtcbiAgICAgICAgICBpZiAoc3RyLmNoYXJBdChwb3NpdGlvbikgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHRva2Vucy5wdXNoKHN5bWJvbClcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9uKytcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBsYXN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkge1xuICAgIHJldHVybiBTWU1CT0xfU1RBUlQuZXhlYyh0b2tlbi5jaGFyQXQoMCkpICYmXG4gICAgICB0b2tlbiAhPT0gJ3RydWUnICYmXG4gICAgICB0b2tlbiAhPT0gJ2ZhbHNlJyAmJlxuICAgICAgdG9rZW4gIT09ICd0aGlzJyAmJlxuICAgICAgdG9rZW4gIT09IHBhcmFtTmFtZSAmJlxuICAgICAgbGFzdCAhPT0gJy4nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Q29uZGl0aW9uYWxGdW5jdGlvbnxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCBwYXJhbU5hbWUpIHtcbiAgICBpZiAodG9rZW5zWzBdID09PSAnWycpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICBsZXQgYnJhY2tldENvdW50ID0gMVxuICAgICAgbGV0IGNvbmRpdGlvbmFsU291cmNlID0gJyByZXR1cm4gKGZ1bmN0aW9uKCcgKyBwYXJhbU5hbWUgKyAnKXsgcmV0dXJuICgnXG4gICAgICBsZXQgbGFzdCA9IG51bGxcbiAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1swXVxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBzaGlmdCBjYWxsLCBhbmQgdGhpbmtzIHdlJ3JlIGNvbXBhcmluZyB0aGUgc2FtZSB2YWx1ZSBoZXJlLCBpLmUuICdbJyB2cyAnXSdcbiAgICAgICAgaWYgKHRva2VuID09PSAnXScpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQtLVxuICAgICAgICAgIGlmIChicmFja2V0Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChsYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyAndHJ1ZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKX0pJ1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uRnVuY3Rpb24gPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oY29uZGl0aW9uYWxTb3VyY2UpKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pXG4gICAgICAgICAgICAgIGNvbmRpdGlvbkZ1bmN0aW9uLnNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlXG4gICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25GdW5jdGlvblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnN5bnRheDplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZTogY29uZGl0aW9uYWxTb3VyY2UgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdbJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudCsrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSkge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcoKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpID8gKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpIDogKHdpbmRvdy4nICsgdG9rZW4gKyAnKSknXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArIHRva2VuXG4gICAgICAgIH1cbiAgICAgICAgbGFzdCA9IHRva2Vucy5zaGlmdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gbWF0Y2hcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbCh0b2tlbnMsIG1hdGNoKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmICFtYXRjaC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHJlc3VsdCArPSB0b2tlbnMuc2hpZnQoKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKSB7XG4gICAgbGV0IHJlc3VsdFxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMCAmJiBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQpLnRyaW0oKVxuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY29uc3QgSU5QVVRfU0VMRUNUT1IgPSAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBsaWNpdFRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIGZvciB0cmlnZ2VyIHNwZWNzXG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSkge1xuICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXSAqL1xuICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVTdHJpbmcoZXhwbGljaXRUcmlnZ2VyKVxuICAgIGRvIHtcbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IHRva2Vucy5sZW5ndGhcbiAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLylcbiAgICAgIGlmICh0cmlnZ2VyICE9PSAnJykge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2V2ZXJ5Jykge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCBldmVyeSA9IHsgdHJpZ2dlcjogJ2V2ZXJ5JyB9XG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgZXZlcnkucG9sbEludGVydmFsID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLykpXG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgZXZlcnkuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaChldmVyeSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgdHJpZ2dlclNwZWMgPSB7IHRyaWdnZXIgfVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXSAhPT0gJywnKSB7XG4gICAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gJ2NoYW5nZWQnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnb25jZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMub25jZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdjb25zdW1lJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jb25zdW1lID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2RlbGF5JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5kZWxheSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZnJvbScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgaWYgKENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgICAgICBpZiAoZnJvbV9hcmcgPT09ICdjbG9zZXN0JyB8fCBmcm9tX2FyZyA9PT0gJ2ZpbmQnIHx8IGZyb21fYXJnID09PSAnbmV4dCcgfHwgZnJvbV9hcmcgPT09ICdwcmV2aW91cycpIHtcbiAgICAgICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgICAgICAvLyBgbmV4dGAgYW5kIGBwcmV2aW91c2AgYWxsb3cgYSBzZWxlY3Rvci1sZXNzIHN5bnRheFxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbV9hcmcgKz0gJyAnICsgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZnJvbSA9IGZyb21fYXJnXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGFyZ2V0JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50YXJnZXQgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Rocm90dGxlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50aHJvdHRsZSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncXVldWUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnF1ZXVlID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdyb290JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RocmVzaG9sZCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2godHJpZ2dlclNwZWMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSBpbml0aWFsTGVuZ3RoKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgIH0gd2hpbGUgKHRva2Vuc1swXSA9PT0gJywnICYmIHRva2Vucy5zaGlmdCgpKVxuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSA9IHRyaWdnZXJTcGVjc1xuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VHJpZ2dlclNwZWNzKGVsdCkge1xuICAgIGNvbnN0IGV4cGxpY2l0VHJpZ2dlciA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRyaWdnZXInKVxuICAgIGxldCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGlmIChleHBsaWNpdFRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gaHRteC5jb25maWcudHJpZ2dlclNwZWNzQ2FjaGVcbiAgICAgIHRyaWdnZXJTcGVjcyA9IChjYWNoZSAmJiBjYWNoZVtleHBsaWNpdFRyaWdnZXJdKSB8fCBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpXG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJTcGVjcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdzdWJtaXQnIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJidXR0b25cIl0sIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCBJTlBVVF9TRUxFQ1RPUikpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2hhbmdlJyB9XVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gY2FuY2VsUG9sbGluZyhlbHQpIHtcbiAgICBnZXRJbnRlcm5hbERhdGEoZWx0KS5jYW5jZWxsZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gc3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIG5vZGVEYXRhLnRpbWVvdXQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGJvZHlDb250YWlucyhlbHQpICYmIG5vZGVEYXRhLmNhbmNlbGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQoc3BlYywgZWx0LCBtYWtlRXZlbnQoJ2h4OnBvbGw6dHJpZ2dlcicsIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlYzogc3BlYyxcbiAgICAgICAgICB0YXJnZXQ6IGVsdFxuICAgICAgICB9KSkpIHtcbiAgICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpXG4gICAgICB9XG4gICAgfSwgc3BlYy5wb2xsSW50ZXJ2YWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MQW5jaG9yRWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNMb2NhbExpbmsoZWx0KSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uLmhvc3RuYW1lID09PSBlbHQuaG9zdG5hbWUgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpICE9PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGVsdElzRGlzYWJsZWQoZWx0KSB7XG4gICAgcmV0dXJuIGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqL1xuICBmdW5jdGlvbiBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgaWYgKChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBpc0xvY2FsTGluayhlbHQpICYmIChlbHQudGFyZ2V0ID09PSAnJyB8fCBlbHQudGFyZ2V0ID09PSAnX3NlbGYnKSkgfHwgKGVsdC50YWdOYW1lID09PSAnRk9STScgJiYgU3RyaW5nKGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKSkudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpKSB7XG4gICAgICBub2RlRGF0YS5ib29zdGVkID0gdHJ1ZVxuICAgICAgbGV0IHZlcmIsIHBhdGhcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgIHZlcmIgPSAnZ2V0J1xuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3QXR0cmlidXRlID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpXG4gICAgICAgIHZlcmIgPSByYXdBdHRyaWJ1dGUgPyByYXdBdHRyaWJ1dGUudG9Mb3dlckNhc2UoKSA6ICdnZXQnXG4gICAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgICB9XG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnYWN0aW9uJylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgfSwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZENhbmNlbChldnQsIG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChldnQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZXZ0LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwic3VibWl0XCJdLCBidXR0b24nKSAmJiBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGVsdC5ocmVmICYmXG4gICAgICAgIChlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT09ICcjJyB8fCBlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykuaW5kZXhPZignIycpICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fE1vdXNlRXZlbnR8S2V5Ym9hcmRFdmVudHxUb3VjaEV2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZXZ0LnR5cGUgPT09ICdjbGljaycgJiZcbiAgICAgIC8vIEB0cy1pZ25vcmUgdGhpcyB3aWxsIHJlc29sdmUgdG8gdW5kZWZpbmVkIGZvciBldmVudHMgdGhhdCBkb24ndCBkZWZpbmUgdGhvc2UgcHJvcGVydGllcywgd2hpY2ggaXMgZmluZVxuICAgICAgKGV2dC5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkge1xuICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXJcbiAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEZpbHRlci5jYWxsKGVsdCwgZXZ0KSAhPT0gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmVudEZpbHRlci5zb3VyY2VcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpldmVudEZpbHRlcjplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtleHBsaWNpdENhbmNlbF1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIGV4cGxpY2l0Q2FuY2VsKSB7XG4gICAgY29uc3QgZWxlbWVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIC8qKiBAdHlwZSB7KE5vZGV8V2luZG93KVtdfSAqL1xuICAgIGxldCBlbHRzVG9MaXN0ZW5PblxuICAgIGlmICh0cmlnZ2VyU3BlYy5mcm9tKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCB0cmlnZ2VyU3BlYy5mcm9tKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IFtlbHRdXG4gICAgfVxuICAgIC8vIHN0b3JlIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMsIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXkgY2hhbmdlXG4gICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uLmZvckVhY2goZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgfSlcbiAgICB9XG4gICAgZm9yRWFjaChlbHRzVG9MaXN0ZW5PbiwgZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGVsdFRvTGlzdGVuT24ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBsaWNpdENhbmNlbCB8fCBzaG91bGRDYW5jZWwoZXZ0LCBlbHQpKSB7XG4gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2dClcbiAgICAgICAgZXZlbnREYXRhLnRyaWdnZXJTcGVjID0gdHJpZ2dlclNwZWNcbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yID09IG51bGwpIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvciA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yLmluZGV4T2YoZWx0KSA8IDApIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvci5wdXNoKGVsdClcbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY29uc3VtZSkge1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50YXJnZXQgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKGFzRWxlbWVudChldnQudGFyZ2V0KSwgdHJpZ2dlclNwZWMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLm9uY2UpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgICAgICAgaWYgKGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEuZGVsYXllZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVsZW1lbnREYXRhLmRlbGF5ZWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocm90dGxlID4gMCkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gbnVsbFxuICAgICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy50aHJvdHRsZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLmRlbGF5ID4gMCkge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZGVsYXllZCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub2RlRGF0YS5saXN0ZW5lckluZm9zID09IG51bGwpIHtcbiAgICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcyA9IFtdXG4gICAgICB9XG4gICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyU3BlYy50cmlnZ2VyLFxuICAgICAgICBsaXN0ZW5lcjogZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgb246IGVsdFRvTGlzdGVuT25cbiAgICAgIH0pXG4gICAgICBlbHRUb0xpc3Rlbk9uLmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICB9KVxuICB9XG5cbiAgbGV0IHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2UgLy8gdXNlZCBieSBpbml0U2Nyb2xsSGFuZGxlclxuICBsZXQgc2Nyb2xsSGFuZGxlciA9IG51bGxcbiAgZnVuY3Rpb24gaW5pdFNjcm9sbEhhbmRsZXIoKSB7XG4gICAgaWYgKCFzY3JvbGxIYW5kbGVyKSB7XG4gICAgICBzY3JvbGxIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgICAgfVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpXG4gICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHdpbmRvd0lzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgICAgICAgIGZvckVhY2goZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXIqPSdyZXZlYWxlZCddLFtkYXRhLWh4LXRyaWdnZXIqPSdyZXZlYWxlZCddXCIpLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIG1heWJlUmV2ZWFsKGVsdClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVJldmVhbChlbHQpIHtcbiAgICBpZiAoIWhhc0F0dHJpYnV0ZShlbHQsICdkYXRhLWh4LXJldmVhbGVkJykgJiYgaXNTY3JvbGxlZEludG9WaWV3KGVsdCkpIHtcbiAgICAgIGVsdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaHgtcmV2ZWFsZWQnLCAndHJ1ZScpXG4gICAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAobm9kZURhdGEuaW5pdEhhc2gpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZSBub2RlIGlzbid0IGluaXRpYWxpemVkLCB3YWl0IGZvciBpdCBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgcmVxdWVzdFxuICAgICAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphZnRlclByb2Nlc3NOb2RlJywgZnVuY3Rpb24oKSB7IHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpIH0sIHsgb25jZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5XG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSW1tZWRpYXRlbHkoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgZGVsYXkpIHtcbiAgICBjb25zdCBsb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW5vZGVEYXRhLmxvYWRlZCkge1xuICAgICAgICBub2RlRGF0YS5sb2FkZWQgPSB0cnVlXG4gICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGxvYWQsIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGxldCBleHBsaWNpdEFjdGlvbiA9IGZhbHNlXG4gICAgZm9yRWFjaChWRVJCUywgZnVuY3Rpb24odmVyYikge1xuICAgICAgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC0nICsgdmVyYikpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LScgKyB2ZXJiKVxuICAgICAgICBleHBsaWNpdEFjdGlvbiA9IHRydWVcbiAgICAgICAgbm9kZURhdGEucGF0aCA9IHBhdGhcbiAgICAgICAgbm9kZURhdGEudmVyYiA9IHZlcmJcbiAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGV4cGxpY2l0QWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQGNhbGxiYWNrIFRyaWdnZXJIYW5kbGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IFtldnRdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKi9cbiAgZnVuY3Rpb24gYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGhhbmRsZXIpIHtcbiAgICBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ3JldmVhbGVkJykge1xuICAgICAgaW5pdFNjcm9sbEhhbmRsZXIoKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICAgIG1heWJlUmV2ZWFsKGFzRWxlbWVudChlbHQpKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2ludGVyc2VjdCcpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyT3B0aW9ucyA9IHt9XG4gICAgICBpZiAodHJpZ2dlclNwZWMucm9vdCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMucm9vdCA9IHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0cmlnZ2VyU3BlYy5yb290KVxuICAgICAgfVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocmVzaG9sZCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMudGhyZXNob2xkID0gcGFyc2VGbG9hdCh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpXG4gICAgICB9XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlbnRyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXVxuICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2ludGVyc2VjdCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgb2JzZXJ2ZXJPcHRpb25zKVxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShhc0VsZW1lbnQoZWx0KSlcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdsb2FkJykge1xuICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIG1ha2VFdmVudCgnbG9hZCcsIHsgZWx0IH0pKSkge1xuICAgICAgICBsb2FkSW1tZWRpYXRlbHkoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnBvbGxJbnRlcnZhbCA+IDApIHtcbiAgICAgIG5vZGVEYXRhLnBvbGxpbmcgPSB0cnVlXG4gICAgICBwcm9jZXNzUG9sbGluZyhhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3NIeE9uKG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbHQuYXR0cmlidXRlc1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdLm5hbWVcbiAgICAgIGlmIChzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb246JykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb246JykgfHxcbiAgICAgICAgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uLScpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uLScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBjb25zdCBIWF9PTl9RVUVSWSA9IG5ldyBYUGF0aEV2YWx1YXRvcigpXG4gICAgLmNyZWF0ZUV4cHJlc3Npb24oJy4vLypbQCpbIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbjpcIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb246XCIpIG9yJyArXG4gICAgICAnIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbi1cIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb24tXCIpIF1dJylcblxuICBmdW5jdGlvbiBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cykge1xuICAgIGlmIChzaG91bGRQcm9jZXNzSHhPbihlbHQpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChlbHQpKVxuICAgIH1cbiAgICBjb25zdCBpdGVyID0gSFhfT05fUVVFUlkuZXZhbHVhdGUoZWx0KVxuICAgIGxldCBub2RlID0gbnVsbFxuICAgIHdoaWxlIChub2RlID0gaXRlci5pdGVyYXRlTmV4dCgpKSBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChub2RlKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpIHtcbiAgICAvKiogQHR5cGUge0VsZW1lbnRbXX0gKi9cbiAgICBjb25zdCBlbGVtZW50cyA9IFtdXG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWx0LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgcHJvY2Vzc0hYT25Sb290KGNoaWxkLCBlbGVtZW50cylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpXG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCkge1xuICAgIGlmIChlbHQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgY29uc3QgYm9vc3RlZFNlbGVjdG9yID0gJywgW2h4LWJvb3N0XSBhLCBbZGF0YS1oeC1ib29zdF0gYSwgYVtoeC1ib29zdF0sIGFbZGF0YS1oeC1ib29zdF0nXG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvblNlbGVjdG9ycyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGUgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2VdXG4gICAgICAgIGlmIChleHRlbnNpb24uZ2V0U2VsZWN0b3JzKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMoKVxuICAgICAgICAgIGlmIChzZWxlY3RvcnMpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvblNlbGVjdG9ycy5wdXNoKHNlbGVjdG9ycylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGVsdC5xdWVyeVNlbGVjdG9yQWxsKFZFUkJfU0VMRUNUT1IgKyBib29zdGVkU2VsZWN0b3IgKyBcIiwgZm9ybSwgW3R5cGU9J3N1Ym1pdCddLFwiICtcbiAgICAgICAgJyBbaHgtZXh0XSwgW2RhdGEtaHgtZXh0XSwgW2h4LXRyaWdnZXJdLCBbZGF0YS1oeC10cmlnZ2VyXScgKyBleHRlbnNpb25TZWxlY3RvcnMuZmxhdCgpLm1hcChzID0+ICcsICcgKyBzKS5qb2luKCcnKSlcblxuICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICogc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gKi8gKGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIikpXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBlbHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIilcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGZvcm0gPSByZXNvbHZlVGFyZ2V0KCcjJyArIGdldFJhd0F0dHJpYnV0ZShlbHQsICdmb3JtJyksIGVsdC5nZXRSb290Tm9kZSgpKSB8fCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKVxuICAgIGlmICghZm9ybSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXRCdXR0b25UcmFja2luZyhlbHQpIHtcbiAgICAvLyBuZWVkIHRvIGhhbmRsZSBib3RoIGNsaWNrIGFuZCBmb2N1cyBpbjpcbiAgICAvLyAgIGZvY3VzaW4gLSBpbiBjYXNlIHNvbWVvbmUgdGFicyBpbiB0byBhIGJ1dHRvbiBhbmQgaGl0cyB0aGUgc3BhY2UgYmFyXG4gICAgLy8gICBjbGljayAtIG9uIE9TWCBidXR0b25zIGRvIG5vdCBmb2N1cyBvbiBjbGljayBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzI0XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGVcbiAgICovXG4gIGZ1bmN0aW9uIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIGNvZGUpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGVEYXRhLm9uSGFuZGxlcnMpKSB7XG4gICAgICBub2RlRGF0YS5vbkhhbmRsZXJzID0gW11cbiAgICB9XG4gICAgbGV0IGZ1bmNcbiAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICBmdW5jID0gbmV3IEZ1bmN0aW9uKCdldmVudCcsIGNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgZnVuYy5jYWxsKGVsdCwgZSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgbm9kZURhdGEub25IYW5kbGVycy5wdXNoKHsgZXZlbnQ6IGV2ZW50TmFtZSwgbGlzdGVuZXIgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0h4T25XaWxkY2FyZChlbHQpIHtcbiAgICAvLyB3aXBlIGFueSBwcmV2aW91cyBvbiBoYW5kbGVycyBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMgcHJlY2VkZW5jZVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWx0KVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGNvbnN0IHZhbHVlID0gZWx0LmF0dHJpYnV0ZXNbaV0udmFsdWVcbiAgICAgIGlmIChzdGFydHNXaXRoKG5hbWUsICdoeC1vbicpIHx8IHN0YXJ0c1dpdGgobmFtZSwgJ2RhdGEtaHgtb24nKSkge1xuICAgICAgICBjb25zdCBhZnRlck9uUG9zaXRpb24gPSBuYW1lLmluZGV4T2YoJy1vbicpICsgM1xuICAgICAgICBjb25zdCBuZXh0Q2hhciA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uLCBhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICBpZiAobmV4dENoYXIgPT09ICctJyB8fCBuZXh0Q2hhciA9PT0gJzonKSB7XG4gICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgICAvLyBpZiB0aGUgZXZlbnROYW1lIHN0YXJ0cyB3aXRoIGEgY29sb24gb3IgZGFzaCwgcHJlcGVuZCBcImh0bXhcIiBmb3Igc2hvcnRoYW5kIHN1cHBvcnRcbiAgICAgICAgICBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICc6JykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14JyArIGV2ZW50TmFtZVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICctJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoMSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnaHRteC0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSg1KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXROb2RlKGVsdCkge1xuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAobm9kZURhdGEuaW5pdEhhc2ggIT09IGF0dHJpYnV0ZUhhc2goZWx0KSkge1xuICAgICAgLy8gY2xlYW4gdXAgYW55IHByZXZpb3VzbHkgcHJvY2Vzc2VkIGluZm9cbiAgICAgIGRlSW5pdE5vZGUoZWx0KVxuXG4gICAgICBub2RlRGF0YS5pbml0SGFzaCA9IGF0dHJpYnV0ZUhhc2goZWx0KVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpXG5cbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgaWYgKGVsdC52YWx1ZSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG5vZGVEYXRhLmxhc3RWYWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBnZXRUcmlnZ2VyU3BlY3MoZWx0KVxuICAgICAgY29uc3QgaGFzRXhwbGljaXRIdHRwQWN0aW9uID0gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcblxuICAgICAgaWYgKCFoYXNFeHBsaWNpdEh0dHBBY3Rpb24pIHtcbiAgICAgICAgaWYgKGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1ib29zdCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuICAgICAgICB9IGVsc2UgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC10cmlnZ2VyJykpIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgICAgLy8gRm9yIFwibmFrZWRcIiB0cmlnZ2VycywgZG9uJ3QgZG8gYW55dGhpbmcgYXQgYWxsXG4gICAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nIHx8IChnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JyAmJiBoYXNBdHRyaWJ1dGUoZWx0LCAnZm9ybScpKSkge1xuICAgICAgICBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclByb2Nlc3NOb2RlJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIG5ldyBjb250ZW50LCBlbmFibGluZyBodG14IGJlaGF2aW9yLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgY29udGVudCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBET00gb3V0c2lkZSBvZiB0aGUgbm9ybWFsIGh0bXggcmVxdWVzdCBjeWNsZSBidXQgc3RpbGwgd2FudCBodG14IGF0dHJpYnV0ZXMgdG8gd29yay5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcHJvY2Vzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgZWxlbWVudCB0byBwcm9jZXNzXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShlbHQpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpbml0Tm9kZShlbHQpXG4gICAgZm9yRWFjaChmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSwgZnVuY3Rpb24oY2hpbGQpIHsgaW5pdE5vZGUoY2hpbGQpIH0pXG4gICAgZm9yRWFjaChmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSwgcHJvY2Vzc0h4T25XaWxkY2FyZClcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV2ZW50L0xvZyBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRldGFpbFxuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgLy8gVGhpcyBicmVha3MgZXhwZWN0ZWQgZW5jYXBzdWxhdGlvbiBidXQgbmVlZHMgdG8gYmUgaGVyZSB1bnRpbCBkZWNpZGVkIG90aGVyd2lzZSBieSBjb3JlIGRldnNcbiAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBldnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsXG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXJyb3JFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZXZlbnROYW1lIH0sIGRldGFpbCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpIHtcbiAgICByZXR1cm4gZXZlbnROYW1lID09PSAnaHRteDphZnRlclByb2Nlc3NOb2RlJ1xuICB9XG5cbiAgLyoqXG4gICAqIGB3aXRoRXh0ZW5zaW9uc2AgbG9jYXRlcyBhbGwgYWN0aXZlIGV4dGVuc2lvbnMgZm9yIGEgcHJvdmlkZWQgZWxlbWVudCwgdGhlblxuICAgKiBleGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdXNpbmcgZWFjaCBvZiB0aGUgYWN0aXZlIGV4dGVuc2lvbnMuICBJdCBzaG91bGRcbiAgICogYmUgY2FsbGVkIGludGVybmFsbHkgYXQgZXZlcnkgZXh0ZW5kYWJsZSBleGVjdXRpb24gcG9pbnQgaW4gaHRteC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHsoZXh0ZW5zaW9uOkh0bXhFeHRlbnNpb24pID0+IHZvaWR9IHRvRG9cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aEV4dGVuc2lvbnMoZWx0LCB0b0RvKSB7XG4gICAgZm9yRWFjaChnZXRFeHRlbnNpb25zKGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9EbyhleHRlbnNpb24pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ0Vycm9yKG1zZykge1xuICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1zZylcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICBjb25zb2xlLmxvZygnRVJST1I6ICcsIG1zZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBnaXZlbiBldmVudCBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RyaWdnZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byB0cmlnZ2VyXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsIGRldGFpbHMgZm9yIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRldGFpbCA9PSBudWxsKSB7XG4gICAgICBkZXRhaWwgPSB7fVxuICAgIH1cbiAgICBkZXRhaWwuZWx0ID0gZWx0XG4gICAgY29uc3QgZXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgaWYgKGh0bXgubG9nZ2VyICYmICFpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSkge1xuICAgICAgaHRteC5sb2dnZXIoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICB9XG4gICAgaWYgKGRldGFpbC5lcnJvcikge1xuICAgICAgbG9nRXJyb3IoZGV0YWlsLmVycm9yKVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6ZXJyb3InLCB7IGVycm9ySW5mbzogZGV0YWlsIH0pXG4gICAgfVxuICAgIGxldCBldmVudFJlc3VsdCA9IGVsdC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGtlYmFiTmFtZSA9IGtlYmFiRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAgICBpZiAoZXZlbnRSZXN1bHQgJiYga2ViYWJOYW1lICE9PSBldmVudE5hbWUpIHtcbiAgICAgIGNvbnN0IGtlYmFiZWRFdmVudCA9IG1ha2VFdmVudChrZWJhYk5hbWUsIGV2ZW50LmRldGFpbClcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgZWx0LmRpc3BhdGNoRXZlbnQoa2ViYWJlZEV2ZW50KVxuICAgIH1cbiAgICB3aXRoRXh0ZW5zaW9ucyhhc0VsZW1lbnQoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIChleHRlbnNpb24ub25FdmVudChldmVudE5hbWUsIGV2ZW50KSAhPT0gZmFsc2UgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgfSlcbiAgICByZXR1cm4gZXZlbnRSZXN1bHRcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhpc3RvcnkgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsZXQgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAvKipcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRIaXN0b3J5RWxlbWVudCgpIHtcbiAgICBjb25zdCBoaXN0b3J5RWx0ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpXG4gICAgcmV0dXJuIGhpc3RvcnlFbHQgfHwgZ2V0RG9jdW1lbnQoKS5ib2R5XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbHRcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVUb0hpc3RvcnlDYWNoZSh1cmwsIHJvb3RFbHQpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgc3RhdGUgdG8gc2F2ZVxuICAgIGNvbnN0IGlubmVySFRNTCA9IGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShyb290RWx0KVxuICAgIGNvbnN0IHRpdGxlID0gZ2V0RG9jdW1lbnQoKS50aXRsZVxuICAgIGNvbnN0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSA8PSAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbiBldmVudHVhbGx5IGFscmVhZHkgZXhpc3RpbmcgY2FjaGUgaXMgcHVyZ2VkXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICBoaXN0b3J5Q2FjaGUuc3BsaWNlKGksIDEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIEh0bXhIaXN0b3J5SXRlbSAqL1xuICAgIGNvbnN0IG5ld0hpc3RvcnlJdGVtID0geyB1cmwsIGNvbnRlbnQ6IGlubmVySFRNTCwgdGl0bGUsIHNjcm9sbCB9XG5cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5SXRlbUNyZWF0ZWQnLCB7IGl0ZW06IG5ld0hpc3RvcnlJdGVtLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG5cbiAgICBoaXN0b3J5Q2FjaGUucHVzaChuZXdIaXN0b3J5SXRlbSlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUpIHtcbiAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpXG4gICAgfVxuXG4gICAgLy8ga2VlcCB0cnlpbmcgdG8gc2F2ZSB0aGUgY2FjaGUgdW50aWwgaXQgc3VjY2VlZHMgb3IgaXMgZW1wdHlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5Q2FjaGUpKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZUVycm9yJywgeyBjYXVzZTogZSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuICAgICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKSAvLyBzaHJpbmsgdGhlIGNhY2hlIGFuZCByZXRyeVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeUl0ZW1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNjcm9sbFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcmV0dXJucyB7SHRteEhpc3RvcnlJdGVtfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDYWNoZWRIaXN0b3J5KHVybCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIHJldHVybiBoaXN0b3J5Q2FjaGVbaV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KGVsdCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGh0bXguY29uZmlnLnJlcXVlc3RDbGFzc1xuICAgIGNvbnN0IGNsb25lID0gLyoqIEB0eXBlIEVsZW1lbnQgKi8gKGVsdC5jbG9uZU5vZGUodHJ1ZSkpXG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnLicgKyBjbGFzc05hbWUpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhc3NOYW1lKVxuICAgIH0pXG4gICAgLy8gcmVtb3ZlIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgZm9yIGFueSBlbGVtZW50IGRpc2FibGVkIGR1ZSB0byBhbiBodG14IHJlcXVlc3RcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICdbZGF0YS1kaXNhYmxlZC1ieS1odG14XScpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgfSlcbiAgICByZXR1cm4gY2xvbmUuaW5uZXJIVE1MXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKSB7XG4gICAgY29uc3QgZWx0ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50UGF0aEZvckhpc3RvcnkgfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAgIC8vIEFsbG93IGhpc3Rvcnkgc25hcHNob3QgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCB3aGVyZSBoeC1oaXN0b3J5PVwiZmFsc2VcIlxuICAgIC8vIGlzIHByZXNlbnQgKmFueXdoZXJlKiBpbiB0aGUgY3VycmVudCBkb2N1bWVudCB3ZSdyZSBhYm91dCB0byBzYXZlLFxuICAgIC8vIHNvIHdlIGNhbiBwcmV2ZW50IHByaXZpbGVnZWQgZGF0YSBlbnRlcmluZyB0aGUgY2FjaGUuXG4gICAgLy8gVGhlIHBhZ2Ugd2lsbCBzdGlsbCBiZSByZWFjaGFibGUgYXMgYSBoaXN0b3J5IGVudHJ5LCBidXQgaHRteCB3aWxsIGZldGNoIGl0XG4gICAgLy8gbGl2ZSBmcm9tIHRoZSBzZXJ2ZXIgb25wb3BzdGF0ZSByYXRoZXIgdGhhbiBsb29rIGluIHRoZSBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICBsZXQgZGlzYWJsZUhpc3RvcnlDYWNoZVxuICAgIHRyeSB7XG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0nKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJRTExOiBpbnNlbnNpdGl2ZSBtb2RpZmllciBub3Qgc3VwcG9ydGVkIHNvIGZhbGxiYWNrIHRvIGNhc2Ugc2Vuc2l0aXZlIHNlbGVjdG9yXG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCJdLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiXScpXG4gICAgfVxuICAgIGlmICghZGlzYWJsZUhpc3RvcnlDYWNoZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVNhdmUnLCB7IHBhdGgsIGhpc3RvcnlFbHQ6IGVsdCB9KVxuICAgICAgc2F2ZVRvSGlzdG9yeUNhY2hlKHBhdGgsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCBnZXREb2N1bWVudCgpLnRpdGxlLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcHVzaFVybEludG9IaXN0b3J5KHBhdGgpIHtcbiAgLy8gcmVtb3ZlIHRoZSBjYWNoZSBidXN0ZXIgcGFyYW1ldGVyLCBpZiBhbnlcbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvb3JnXFwuaHRteFxcLmNhY2hlLWJ1c3Rlcj1bXiZdKiY/LywgJycpXG4gICAgICBpZiAoZW5kc1dpdGgocGF0aCwgJyYnKSB8fCBlbmRzV2l0aChwYXRoLCAnPycpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIHtcbiAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICB9XG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlVXJsSW5IaXN0b3J5KHBhdGgpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0dGxlSW1tZWRpYXRlbHkodGFza3MpIHtcbiAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICB0YXNrLmNhbGwodW5kZWZpbmVkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgY29uc3QgZGV0YWlscyA9IHsgcGF0aCwgeGhyOiByZXF1ZXN0IH1cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzJywgZGV0YWlscylcbiAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1DdXJyZW50LVVSTCcsIGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZilcbiAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZCcsIGRldGFpbHMpXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KHRoaXMucmVzcG9uc2UpXG4gICAgICAgIC8qKiBAdHlwZSBQYXJlbnROb2RlICovXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpIHx8IGZyYWdtZW50XG4gICAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuXG4gICAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGNvbnRlbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGNhY2hlTWlzczogdHJ1ZSwgc2VydmVyUmVzcG9uc2U6IHRoaXMucmVzcG9uc2UgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWRFcnJvcicsIGRldGFpbHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3Quc2VuZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzdG9yZUhpc3RvcnkocGF0aCkge1xuICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgcGF0aCA9IHBhdGggfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRIaXN0b3J5KHBhdGgpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY2FjaGVkLmNvbnRlbnQpXG4gICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGNhY2hlZC5zY3JvbGwpXG4gICAgICB9LCAwKSAvLyBuZXh0ICd0aWNrJywgc28gYnJvd3NlciBoYXMgdGltZSB0byByZW5kZXIgbGF5b3V0XG4gICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgaXRlbTogY2FjaGVkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5yZWZyZXNoT25IaXN0b3J5TWlzcykge1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gcmVsb2FkKCkgZnVuY3Rpb24gdGhyb3dzIGVycm9yXG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpIHtcbiAgICBsZXQgaW5kaWNhdG9ycyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluZGljYXRvcicpKVxuICAgIGlmIChpbmRpY2F0b3JzID09IG51bGwpIHtcbiAgICAgIGluZGljYXRvcnMgPSBbZWx0XVxuICAgIH1cbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBpYy5jbGFzc0xpc3QuYWRkLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgfSlcbiAgICByZXR1cm4gaW5kaWNhdG9yc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBkaXNhYmxlRWxlbWVudHMoZWx0KSB7XG4gICAgbGV0IGRpc2FibGVkRWx0cyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWRpc2FibGVkLWVsdCcpKVxuICAgIGlmIChkaXNhYmxlZEVsdHMgPT0gbnVsbCkge1xuICAgICAgZGlzYWJsZWRFbHRzID0gW11cbiAgICB9XG4gICAgZm9yRWFjaChkaXNhYmxlZEVsdHMsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnLCAnJylcbiAgICB9KVxuICAgIHJldHVybiBkaXNhYmxlZEVsdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gaW5kaWNhdG9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVkKSB7XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgaWMuY2xhc3NMaXN0LnJlbW92ZS5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChkaXNhYmxlZCwgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnB1dCBWYWx1ZSBQcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IHByb2Nlc3NlZFtpXVxuICAgICAgaWYgKG5vZGUuaXNTYW1lTm9kZShlbHQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkSW5jbHVkZShlbGVtZW50KSB7XG4gICAgLy8gQ2FzdCB0byB0cmljayB0c2MsIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCB3b3JrIGZpbmUgaGVyZVxuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudH0gKi8gKGVsZW1lbnQpXG4gICAgaWYgKGVsdC5uYW1lID09PSAnJyB8fCBlbHQubmFtZSA9PSBudWxsIHx8IGVsdC5kaXNhYmxlZCB8fCBjbG9zZXN0KGVsdCwgJ2ZpZWxkc2V0W2Rpc2FibGVkXScpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgLy8gaWdub3JlIFwic3VibWl0dGVyXCIgdHlwZXMgKHNlZSBqUXVlcnkgc3JjL3NlcmlhbGl6ZS5qcylcbiAgICBpZiAoZWx0LnR5cGUgPT09ICdidXR0b24nIHx8IGVsdC50eXBlID09PSAnc3VibWl0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ltYWdlJyB8fCBlbHQudGFnTmFtZSA9PT0gJ3Jlc2V0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGVsdC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsdC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm4gZWx0LmNoZWNrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheXxGb3JtRGF0YUVudHJ5VmFsdWV9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxldCB2YWx1ZXMgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdmFsdWUuaW5kZXhPZih2KSA8IDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpXG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgIGZvckVhY2godmFsdWVzLCB2ID0+IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudHxIVE1MU2VsZWN0RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpIHtcbiAgICBpZiAoZWx0ID09IG51bGwgfHwgaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NlZC5wdXNoKGVsdClcbiAgICB9XG4gICAgaWYgKHNob3VsZEluY2x1ZGUoZWx0KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJylcbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgbGV0IHZhbHVlID0gZWx0LnZhbHVlXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgZWx0Lm11bHRpcGxlKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uOmNoZWNrZWQnKSkubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuICgvKiogQHR5cGUgSFRNTE9wdGlvbkVsZW1lbnQgKi8oZSkpLnZhbHVlIH0pXG4gICAgICB9XG4gICAgICAvLyBpbmNsdWRlIGZpbGUgaW5wdXRzXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbHQuZmlsZXMpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5maWxlcylcbiAgICAgIH1cbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGVsdC5lbGVtZW50cywgZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHByb2Nlc3NlZC5pbmRleE9mKGlucHV0KSA+PSAwKSB7XG4gICAgICAgICAgLy8gVGhlIGlucHV0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZCBhZGRlZCB0byB0aGUgdmFsdWVzLCBidXQgdGhlIEZvcm1EYXRhIHRoYXQgd2lsbCBiZVxuICAgICAgICAgIC8vICBjb25zdHJ1Y3RlZCByaWdodCBhZnRlciBvbiB0aGUgZm9ybSwgd2lsbCBpbmNsdWRlIGl0IG9uY2UgYWdhaW4uIFNvIHJlbW92ZSB0aGF0IGlucHV0J3MgdmFsdWVcbiAgICAgICAgICAvLyAgbm93IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShpbnB1dC5uYW1lLCBpbnB1dC52YWx1ZSwgZm9ybURhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1c2goaW5wdXQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgICAgdmFsaWRhdGVFbGVtZW50KGlucHV0LCBlcnJvcnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBuZXcgRm9ybURhdGEoZWx0KS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgJiYgdmFsdWUubmFtZSA9PT0gJycpIHtcbiAgICAgICAgICByZXR1cm4gLy8gaWdub3JlIG5vLW5hbWUgZmlsZXNcbiAgICAgICAgfVxuICAgICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICovXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50ICYgRWxlbWVudEludGVybmFsc30gKi8gKGVsdClcbiAgICBpZiAoZWxlbWVudC53aWxsVmFsaWRhdGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOnZhbGlkYXRlJylcbiAgICAgIGlmICghZWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBlbHQ6IGVsZW1lbnQsIG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOmZhaWxlZCcsIHsgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBvbmUgRm9ybURhdGEgd2l0aCB0aG9zZSBmcm9tIGFub3RoZXIuXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IHJlY2VpdmVyIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBkb25vciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIG92ZXJyaWRpbmcgdmFsdWVzXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX0gdGhlIHtAbGlua2NvZGUgcmVjZWl2ZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvdmVycmlkZUZvcm1EYXRhKHJlY2VpdmVyLCBkb25vcikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGRvbm9yLmtleXMoKSkge1xuICAgICAgcmVjZWl2ZXIuZGVsZXRlKGtleSlcbiAgICB9XG4gICAgZG9ub3IuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZWNlaXZlci5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZWNlaXZlclxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEByZXR1cm5zIHt7ZXJyb3JzOiBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdLCBmb3JtRGF0YTogRm9ybURhdGEsIHZhbHVlczogT2JqZWN0fX1cbiAqL1xuICBmdW5jdGlvbiBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpIHtcbiAgICAvKiogQHR5cGUgRWxlbWVudFtdICovXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gW11cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgY29uc3QgcHJpb3JpdHlGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgLyoqIEB0eXBlIEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCAmJiAhYm9keUNvbnRhaW5zKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBvbmx5IHZhbGlkYXRlIHdoZW4gZm9ybSBpcyBkaXJlY3RseSBzdWJtaXR0ZWQgYW5kIG5vdmFsaWRhdGUgb3IgZm9ybW5vdmFsaWRhdGUgYXJlIG5vdCBzZXRcbiAgICAvLyBvciBpZiB0aGUgZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgaHgtdmFsaWRhdGU9XCJ0cnVlXCIgb24gaXRcbiAgICBsZXQgdmFsaWRhdGUgPSAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmIGVsdC5ub1ZhbGlkYXRlICE9PSB0cnVlKSB8fCBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC12YWxpZGF0ZScpID09PSAndHJ1ZSdcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSB7XG4gICAgICB2YWxpZGF0ZSA9IHZhbGlkYXRlICYmIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZC5mb3JtTm9WYWxpZGF0ZSAhPT0gdHJ1ZVxuICAgIH1cblxuICAgIC8vIGZvciBhIG5vbi1HRVQgaW5jbHVkZSB0aGUgY2xvc2VzdCBmb3JtXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIHByaW9yaXR5Rm9ybURhdGEsIGVycm9ycywgY2xvc2VzdChlbHQsICdmb3JtJyksIHZhbGlkYXRlKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKVxuXG4gICAgLy8gaWYgYSBidXR0b24gb3Igc3VibWl0IHdhcyBjbGlja2VkIGxhc3QsIGluY2x1ZGUgaXRzIHZhbHVlXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCBlbHQudGFnTmFtZSA9PT0gJ0JVVFRPTicgfHxcbiAgICAoZWx0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcpKSB7XG4gICAgICBjb25zdCBidXR0b24gPSBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgKC8qKiBAdHlwZSBIVE1MSW5wdXRFbGVtZW50fEhUTUxCdXR0b25FbGVtZW50ICovKGVsdCkpXG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGJ1dHRvbiwgJ25hbWUnKVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIGJ1dHRvbi52YWx1ZSwgcHJpb3JpdHlGb3JtRGF0YSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIGFueSBleHBsaWNpdCBpbmNsdWRlc1xuICAgIGNvbnN0IGluY2x1ZGVzID0gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5jbHVkZScpXG4gICAgZm9yRWFjaChpbmNsdWRlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBhc0VsZW1lbnQobm9kZSksIHZhbGlkYXRlKVxuICAgICAgLy8gaWYgYSBub24tZm9ybSBpcyBpbmNsdWRlZCwgaW5jbHVkZSBhbnkgaW5wdXQgdmFsdWVzIHdpdGhpbiBpdFxuICAgICAgaWYgKCFtYXRjaGVzKG5vZGUsICdmb3JtJykpIHtcbiAgICAgICAgZm9yRWFjaChhc1BhcmVudE5vZGUobm9kZSkucXVlcnlTZWxlY3RvckFsbChJTlBVVF9TRUxFQ1RPUiksIGZ1bmN0aW9uKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGRlc2NlbmRhbnQsIHZhbGlkYXRlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyB2YWx1ZXMgZnJvbSBhIDxmb3JtPiB0YWtlIHByZWNlZGVuY2UsIG92ZXJyaWRpbmcgdGhlIHJlZ3VsYXIgdmFsdWVzXG4gICAgb3ZlcnJpZGVGb3JtRGF0YShmb3JtRGF0YSwgcHJpb3JpdHlGb3JtRGF0YSlcblxuICAgIHJldHVybiB7IGVycm9ycywgZm9ybURhdGEsIHZhbHVlczogZm9ybURhdGFQcm94eShmb3JtRGF0YSkgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXR1cm5TdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHthbnl9IHJlYWxWYWx1ZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBuYW1lLCByZWFsVmFsdWUpIHtcbiAgICBpZiAocmV0dXJuU3RyICE9PSAnJykge1xuICAgICAgcmV0dXJuU3RyICs9ICcmJ1xuICAgIH1cbiAgICBpZiAoU3RyaW5nKHJlYWxWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZWFsVmFsdWUgPSBKU09OLnN0cmluZ2lmeShyZWFsVmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IHMgPSBlbmNvZGVVUklDb21wb25lbnQocmVhbFZhbHVlKVxuICAgIHJldHVyblN0ciArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBzXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF8T2JqZWN0fSB2YWx1ZXNcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBmdW5jdGlvbiB1cmxFbmNvZGUodmFsdWVzKSB7XG4gICAgdmFsdWVzID0gZm9ybURhdGFGcm9tT2JqZWN0KHZhbHVlcylcbiAgICBsZXQgcmV0dXJuU3RyID0gJydcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm5TdHIgPSBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBamF4XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9tcHRcbiAqIEByZXR1cm5zIHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHQpIHtcbiAgICAvKiogQHR5cGUgSHRteEhlYWRlclNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgJ0hYLVJlcXVlc3QnOiAndHJ1ZScsXG4gICAgICAnSFgtVHJpZ2dlcic6IGdldFJhd0F0dHJpYnV0ZShlbHQsICdpZCcpLFxuICAgICAgJ0hYLVRyaWdnZXItTmFtZSc6IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJyksXG4gICAgICAnSFgtVGFyZ2V0JzogZ2V0QXR0cmlidXRlVmFsdWUodGFyZ2V0LCAnaWQnKSxcbiAgICAgICdIWC1DdXJyZW50LVVSTCc6IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cbiAgICBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LWhlYWRlcnMnLCBmYWxzZSwgaGVhZGVycylcbiAgICBpZiAocHJvbXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLVByb21wdCddID0gcHJvbXB0XG4gICAgfVxuICAgIGlmIChnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Cb29zdGVkJ10gPSAndHJ1ZSdcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIC8qKlxuICogZmlsdGVyVmFsdWVzIHRha2VzIGFuIG9iamVjdCBjb250YWluaW5nIGZvcm0gaW5wdXQgdmFsdWVzXG4gKiBhbmQgcmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBvbmx5IGNvbnRhaW5zIGtleXMgdGhhdCBhcmVcbiAqIHNwZWNpZmllZCBieSB0aGUgY2xvc2VzdCBcImh4LXBhcmFtc1wiIGF0dHJpYnV0ZVxuICogQHBhcmFtIHtGb3JtRGF0YX0gaW5wdXRWYWx1ZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZmlsdGVyVmFsdWVzKGlucHV0VmFsdWVzLCBlbHQpIHtcbiAgICBjb25zdCBwYXJhbXNWYWx1ZSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wYXJhbXMnKVxuICAgIGlmIChwYXJhbXNWYWx1ZSkge1xuICAgICAgaWYgKHBhcmFtc1ZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlLmluZGV4T2YoJ25vdCAnKSA9PT0gMCkge1xuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnN1YnN0cig0KS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaW5wdXRWYWx1ZXMuZGVsZXRlKG5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaWYgKGlucHV0VmFsdWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZXMuZ2V0QWxsKG5hbWUpLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHsgbmV3VmFsdWVzLmFwcGVuZChuYW1lLCB2YWx1ZSkgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBuZXdWYWx1ZXNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0FuY2hvckxpbmsoZWx0KSB7XG4gICAgcmV0dXJuICEhZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSA+PSAwXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IFtzd2FwSW5mb092ZXJyaWRlXVxuICogQHJldHVybnMge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBJbmZvT3ZlcnJpZGUpIHtcbiAgICBjb25zdCBzd2FwSW5mbyA9IHN3YXBJbmZvT3ZlcnJpZGUgfHwgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN3YXAnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBzd2FwU3BlYyA9IHtcbiAgICAgIHN3YXBTdHlsZTogZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCA/ICdpbm5lckhUTUwnIDogaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSxcbiAgICAgIHN3YXBEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFN3YXBEZWxheSxcbiAgICAgIHNldHRsZURlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U2V0dGxlRGVsYXlcbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLnNjcm9sbEludG9WaWV3T25Cb29zdCAmJiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmICFpc0FuY2hvckxpbmsoZWx0KSkge1xuICAgICAgc3dhcFNwZWMuc2hvdyA9ICd0b3AnXG4gICAgfVxuICAgIGlmIChzd2FwSW5mbykge1xuICAgICAgY29uc3Qgc3BsaXQgPSBzcGxpdE9uV2hpdGVzcGFjZShzd2FwSW5mbylcbiAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNwbGl0W2ldXG4gICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ3N3YXA6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDUpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2V0dGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zZXR0bGVEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDcpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZigndHJhbnNpdGlvbjonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMudHJhbnNpdGlvbiA9IHZhbHVlLnN1YnN0cigxMSkgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignaWdub3JlVGl0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gdmFsdWUuc3Vic3RyKDEyKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFNwZWMgPSB2YWx1ZS5zdWJzdHIoNylcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzY3JvbGxTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsID0gc2Nyb2xsVmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGxUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2hvdzonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2hvd1NwZWMgPSB2YWx1ZS5zdWJzdHIoNSlcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzaG93U3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzaG93VmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93ID0gc2hvd1ZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvd1RhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdmb2N1cy1zY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzU2Nyb2xsVmFsID0gdmFsdWUuc3Vic3RyKCdmb2N1cy1zY3JvbGw6Jy5sZW5ndGgpXG4gICAgICAgICAgICBzd2FwU3BlYy5mb2N1c1Njcm9sbCA9IGZvY3VzU2Nyb2xsVmFsID09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwU3R5bGUgPSB2YWx1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dFcnJvcignVW5rbm93biBtb2RpZmllciBpbiBoeC1zd2FwOiAnICsgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3BlY1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB1c2VzRm9ybURhdGEoZWx0KSB7XG4gICAgcmV0dXJuIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1lbmNvZGluZycpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfHxcbiAgICAobWF0Y2hlcyhlbHQsICdmb3JtJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2VuY3R5cGUnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmaWx0ZXJlZFBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgeyp8c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZFBhcmFtZXRlcnMpIHtcbiAgICBsZXQgZW5jb2RlZFBhcmFtZXRlcnMgPSBudWxsXG4gICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyA9PSBudWxsKSB7XG4gICAgICAgIGVuY29kZWRQYXJhbWV0ZXJzID0gZXh0ZW5zaW9uLmVuY29kZVBhcmFtZXRlcnMoeGhyLCBmaWx0ZXJlZFBhcmFtZXRlcnMsIGVsdClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5jb2RlZFBhcmFtZXRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbnZlcnNpb24gdG8gYW4gYWN0dWFsIEZvcm1EYXRhIG9iamVjdCBpbiBjYXNlIGZpbHRlcmVkUGFyYW1ldGVycyBpcyBhIGZvcm1EYXRhUHJveHlcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14L2lzc3Vlcy8yMzE3XG4gICAgICAgIHJldHVybiBvdmVycmlkZUZvcm1EYXRhKG5ldyBGb3JtRGF0YSgpLCBmb3JtRGF0YUZyb21PYmplY3QoZmlsdGVyZWRQYXJhbWV0ZXJzKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmxFbmNvZGUoZmlsdGVyZWRQYXJhbWV0ZXJzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7SHRteFNldHRsZUluZm99XG4gKi9cbiAgZnVuY3Rpb24gbWFrZVNldHRsZUluZm8odGFyZ2V0KSB7XG4gICAgcmV0dXJuIHsgdGFza3M6IFtdLCBlbHRzOiBbdGFyZ2V0XSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxTdGF0ZShjb250ZW50LCBzd2FwU3BlYykge1xuICAgIGNvbnN0IGZpcnN0ID0gY29udGVudFswXVxuICAgIGNvbnN0IGxhc3QgPSBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV1cbiAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbFRhcmdldCkge1xuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gMFxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gdGFyZ2V0LnNjcm9sbEhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3dhcFNwZWMuc2hvdykge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0KSB7XG4gICAgICAgIGxldCB0YXJnZXRTdHIgPSBzd2FwU3BlYy5zaG93VGFyZ2V0XG4gICAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0ID09PSAnd2luZG93Jykge1xuICAgICAgICAgIHRhcmdldFN0ciA9ICdib2R5J1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCB0YXJnZXRTdHIpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBldmFsQXNEZWZhdWx0XG4gKiBAcGFyYW0ge09iamVjdD19IHZhbHVlc1xuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICB2YWx1ZXMgPSB7fVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZXNcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgICBsZXQgc3RyID0gYXR0cmlidXRlVmFsdWUudHJpbSgpXG4gICAgICBsZXQgZXZhbHVhdGVWYWx1ZSA9IGV2YWxBc0RlZmF1bHRcbiAgICAgIGlmIChzdHIgPT09ICd1bnNldCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDExKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdHIuaW5kZXhPZignanM6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigzKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCd7JykgIT09IDApIHtcbiAgICAgICAgc3RyID0gJ3snICsgc3RyICsgJ30nXG4gICAgICB9XG4gICAgICBsZXQgdmFyc1ZhbHVlc1xuICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkgeyByZXR1cm4gRnVuY3Rpb24oJ3JldHVybiAoJyArIHN0ciArICcpJykoKSB9LCB7fSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBwYXJzZUpTT04oc3RyKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFyc1ZhbHVlcykge1xuICAgICAgICBpZiAodmFyc1ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gdmFyc1ZhbHVlc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7KCkgPT4gYW55fSB0b0V2YWxcbiAgICogQHBhcmFtIHthbnk9fSBkZWZhdWx0VmFsXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUV2YWwoZWx0LCB0b0V2YWwsIGRlZmF1bHRWYWwpIHtcbiAgICBpZiAoaHRteC5jb25maWcuYWxsb3dFdmFsKSB7XG4gICAgICByZXR1cm4gdG9FdmFsKClcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpldmFsRGlzYWxsb3dlZEVycm9yJylcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFycycsIHRydWUsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFscycsIGZhbHNlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBnZXRFeHByZXNzaW9uVmFycyhlbHQpIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3RzKGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0KSwgZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGhlYWRlclZhbHVlXG4gICAqL1xuICBmdW5jdGlvbiBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpIHtcbiAgICBpZiAoaGVhZGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBPbiBhbiBleGNlcHRpb24sIHRyeSB0byBzZXQgdGhlIGhlYWRlciBVUkkgZW5jb2RlZCBpbnN0ZWFkXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgZW5jb2RlVVJJQ29tcG9uZW50KGhlYWRlclZhbHVlKSlcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyICsgJy1VUkktQXV0b0VuY29kZWQnLCAndHJ1ZScpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocikge1xuICAvLyBOQjogSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgc3R1ZmZcbiAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICYmIHR5cGVvZiAoVVJMKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoeGhyLnJlc3BvbnNlVVJMKVxuICAgICAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJhZFJlc3BvbnNlVXJsJywgeyB1cmw6IHhoci5yZXNwb25zZVVSTCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzSGVhZGVyKHhociwgcmVnZXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cC50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZXMgYW4gaHRteC1zdHlsZSBBSkFYIHJlcXVlc3RcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWpheFxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBVUkwgcGF0aCB0byBtYWtlIHRoZSBBSkFYXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd8SHRteEFqYXhIZWxwZXJDb250ZXh0fSBjb250ZXh0IHRoZSBlbGVtZW50IHRvIHRhcmdldCAoZGVmYXVsdHMgdG8gdGhlICoqYm9keSoqKSB8IGEgc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgfCBhIGNvbnRleHQgb2JqZWN0IHRoYXQgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmdcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5IGlmIG5vIHJlcXVlc3QgaXMgc2VudCwgb3Igd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgZnVuY3Rpb24gYWpheEhlbHBlcih2ZXJiLCBwYXRoLCBjb250ZXh0KSB7XG4gICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8odmVyYi50b0xvd2VyQ2FzZSgpKSlcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dCksXG4gICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgcmVzb2x2ZVRhcmdldChjb250ZXh0LnNvdXJjZSksIGNvbnRleHQuZXZlbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGFuZGxlcjogY29udGV4dC5oYW5kbGVyLFxuICAgICAgICAgICAgaGVhZGVyczogY29udGV4dC5oZWFkZXJzLFxuICAgICAgICAgICAgdmFsdWVzOiBjb250ZXh0LnZhbHVlcyxcbiAgICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQudGFyZ2V0KSxcbiAgICAgICAgICAgIHN3YXBPdmVycmlkZTogY29udGV4dC5zd2FwLFxuICAgICAgICAgICAgc2VsZWN0OiBjb250ZXh0LnNlbGVjdCxcbiAgICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGhpZXJhcmNoeUZvckVsdChlbHQpIHtcbiAgICBjb25zdCBhcnIgPSBbXVxuICAgIHdoaWxlIChlbHQpIHtcbiAgICAgIGFyci5wdXNoKGVsdClcbiAgICAgIGVsdCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB2ZXJpZnlQYXRoKGVsdCwgcGF0aCwgcmVxdWVzdENvbmZpZykge1xuICAgIGxldCBzYW1lSG9zdFxuICAgIGxldCB1cmxcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXJsID0gbmV3IFVSTChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKVxuICAgICAgY29uc3Qgb3JpZ2luID0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgICBzYW1lSG9zdCA9IG9yaWdpbiA9PT0gdXJsLm9yaWdpblxuICAgIH0gZWxzZSB7XG4gICAgLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgVVJMXG4gICAgICB1cmwgPSBwYXRoXG4gICAgICBzYW1lSG9zdCA9IHN0YXJ0c1dpdGgocGF0aCwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5zZWxmUmVxdWVzdHNPbmx5KSB7XG4gICAgICBpZiAoIXNhbWVIb3N0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGVVcmwnLCBtZXJnZU9iamVjdHMoeyB1cmwsIHNhbWVIb3N0IH0sIHJlcXVlc3RDb25maWcpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZvcm1EYXRhfSBvYmpcbiAgICogQHJldHVybiB7Rm9ybURhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvcm1EYXRhKSByZXR1cm4gb2JqXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0uZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9ialtrZXldLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgIShvYmpba2V5XSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgSlNPTi5zdHJpbmdpZnkob2JqW2tleV0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhQXJyYXlQcm94eShmb3JtRGF0YSwgbmFtZSwgYXJyYXkpIHtcbiAgICAvLyBtdXRhdGluZyB0aGUgYXJyYXkgc2hvdWxkIG11dGF0ZSB0aGUgdW5kZXJseWluZyBmb3JtIGRhdGFcbiAgICByZXR1cm4gbmV3IFByb3h5KGFycmF5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIGlmIChrZXkgPT09ICdsZW5ndGgnKSByZXR1cm4gdGFyZ2V0Lmxlbmd0aFxuICAgICAgICBpZiAoa2V5ID09PSAncHVzaCcpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpXG4gICAgICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldFtrZXldICYmIHRhcmdldFtrZXldLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFQcm94eShmb3JtRGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZm9ybURhdGEsIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHN5bWJvbCBjYWxscyB0byB0aGUgRm9ybURhdGEgaXRzZWxmIGRpcmVjdGx5XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgbmFtZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ3RvSlNPTicpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IEpTT04uc3RyaW5naWZ5IGNhbGwgb24gcHJveHlcbiAgICAgICAgICByZXR1cm4gKCkgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lIGluIHRhcmdldCkge1xuICAgICAgICAgIC8vIFdyYXAgaW4gZnVuY3Rpb24gd2l0aCBhcHBseSB0byBjb3JyZWN0bHkgYmluZCB0aGUgRm9ybURhdGEgY29udGV4dCwgYXMgYSBkaXJlY3QgY2FsbCB3b3VsZCByZXN1bHQgaW4gYW4gaWxsZWdhbCBpbnZvY2F0aW9uIGVycm9yXG4gICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcm1EYXRhW25hbWVdLmFwcGx5KGZvcm1EYXRhLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXkgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgICAgLy8gVGhvc2UgMiB1bmRlZmluZWQgJiBzaW5nbGUgdmFsdWUgcmV0dXJucyBhcmUgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkgYXMgd2Ugd2VyZW4ndCB1c2luZyBGb3JtRGF0YSBiZWZvcmVcbiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gYXJyYXlbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZm9ybURhdGFBcnJheVByb3h5KHRhcmdldCwgbmFtZSwgYXJyYXkpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IHRhcmdldC5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEodmFsdWUgaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICAvLyBTdXBwb3J0IE9iamVjdC5hc3NpZ24gY2FsbCBmcm9tIHByb3h5XG4gICAgICBvd25LZXlzOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSlcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRhcmdldCwgcHJvcCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCksIHByb3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7SHRteEFqYXhFdGN9IFtldGNdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmZpcm1lZF1cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCBjb25maXJtZWQpIHtcbiAgICBsZXQgcmVzb2x2ZSA9IG51bGxcbiAgICBsZXQgcmVqZWN0ID0gbnVsbFxuICAgIGV0YyA9IGV0YyAhPSBudWxsID8gZXRjIDoge31cbiAgICBpZiAoZXRjLnJldHVyblByb21pc2UgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICByZWplY3QgPSBfcmVqZWN0XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIGVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZUhhbmRsZXIgPSBldGMuaGFuZGxlciB8fCBoYW5kbGVBamF4UmVzcG9uc2VcbiAgICBjb25zdCBzZWxlY3QgPSBldGMuc2VsZWN0IHx8IG51bGxcblxuICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAvLyBkbyBub3QgaXNzdWUgcmVxdWVzdHMgZm9yIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV0Yy50YXJnZXRPdmVycmlkZSB8fCBhc0VsZW1lbnQoZ2V0VGFyZ2V0KGVsdCkpXG4gICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IHRhcmdldCA9PSBEVU1NWV9FTFQpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGFyZ2V0RXJyb3InLCB7IHRhcmdldDogZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JykgfSlcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGxldCBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBjb25zdCBzdWJtaXR0ZXIgPSBlbHREYXRhLmxhc3RCdXR0b25DbGlja2VkXG5cbiAgICBpZiAoc3VibWl0dGVyKSB7XG4gICAgICBjb25zdCBidXR0b25QYXRoID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1hY3Rpb24nKVxuICAgICAgaWYgKGJ1dHRvblBhdGggIT0gbnVsbCkge1xuICAgICAgICBwYXRoID0gYnV0dG9uUGF0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25WZXJiID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1tZXRob2QnKVxuICAgICAgaWYgKGJ1dHRvblZlcmIgIT0gbnVsbCkge1xuICAgICAgLy8gaWdub3JlIGJ1dHRvbnMgd2l0aCBmb3JtbWV0aG9kPVwiZGlhbG9nXCJcbiAgICAgICAgaWYgKGJ1dHRvblZlcmIudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyhidXR0b25WZXJiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm1RdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1jb25maXJtJylcbiAgICAvLyBhbGxvdyBldmVudC1iYXNlZCBjb25maXJtYXRpb24gdy8gYSBjYWxsYmFja1xuICAgIGlmIChjb25maXJtZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNzdWVSZXF1ZXN0ID0gZnVuY3Rpb24oc2tpcENvbmZpcm1hdGlvbikge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsICEhc2tpcENvbmZpcm1hdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpcm1EZXRhaWxzID0geyB0YXJnZXQsIGVsdCwgcGF0aCwgdmVyYiwgdHJpZ2dlcmluZ0V2ZW50OiBldmVudCwgZXRjLCBpc3N1ZVJlcXVlc3QsIHF1ZXN0aW9uOiBjb25maXJtUXVlc3Rpb24gfVxuICAgICAgaWYgKHRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpcm0nLCBjb25maXJtRGV0YWlscykgPT09IGZhbHNlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzeW5jRWx0ID0gZWx0XG4gICAgbGV0IHN5bmNTdHJhdGVneSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zeW5jJylcbiAgICBsZXQgcXVldWVTdHJhdGVneSA9IG51bGxcbiAgICBsZXQgYWJvcnRhYmxlID0gZmFsc2VcbiAgICBpZiAoc3luY1N0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBzeW5jU3RyaW5ncyA9IHN5bmNTdHJhdGVneS5zcGxpdCgnOicpXG4gICAgICBjb25zdCBzZWxlY3RvciA9IHN5bmNTdHJpbmdzWzBdLnRyaW0oKVxuICAgICAgaWYgKHNlbGVjdG9yID09PSAndGhpcycpIHtcbiAgICAgICAgc3luY0VsdCA9IGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC1zeW5jJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN5bmNFbHQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHNlbGVjdG9yKSlcbiAgICAgIH1cbiAgICAgIC8vIGRlZmF1bHQgdG8gdGhlIGRyb3Agc3RyYXRlZ3lcbiAgICAgIHN5bmNTdHJhdGVneSA9IChzeW5jU3RyaW5nc1sxXSB8fCAnZHJvcCcpLnRyaW0oKVxuICAgICAgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShzeW5jRWx0KVxuICAgICAgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Ryb3AnICYmIGVsdERhdGEueGhyICYmIGVsdERhdGEuYWJvcnRhYmxlICE9PSB0cnVlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdhYm9ydCcpIHtcbiAgICAgICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhYm9ydGFibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAncmVwbGFjZScpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5LmluZGV4T2YoJ3F1ZXVlJykgPT09IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVTdHJBcnJheSA9IHN5bmNTdHJhdGVneS5zcGxpdCgnICcpXG4gICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAocXVldWVTdHJBcnJheVsxXSB8fCAnbGFzdCcpLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgaWYgKGVsdERhdGEuYWJvcnRhYmxlKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZlbnQpXG4gICAgICAgICAgICBpZiAoZXZlbnREYXRhICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyAmJiBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWUpIHtcbiAgICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9IGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gJ2xhc3QnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID09IG51bGwpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2ZpcnN0JyAmJiBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdsYXN0Jykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXSAvLyBkdW1wIGV4aXN0aW5nIHF1ZXVlXG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGVsdERhdGEueGhyID0geGhyXG4gICAgZWx0RGF0YS5hYm9ydGFibGUgPSBhYm9ydGFibGVcbiAgICBjb25zdCBlbmRSZXF1ZXN0TG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWx0RGF0YS54aHIgPSBudWxsXG4gICAgICBlbHREYXRhLmFib3J0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyAhPSBudWxsICYmXG4gICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVkUmVxdWVzdCA9IGVsdERhdGEucXVldWVkUmVxdWVzdHMuc2hpZnQoKVxuICAgICAgICBxdWV1ZWRSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvbXB0UXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHJvbXB0JylcbiAgICBpZiAocHJvbXB0UXVlc3Rpb24pIHtcbiAgICAgIHZhciBwcm9tcHRSZXNwb25zZSA9IHByb21wdChwcm9tcHRRdWVzdGlvbilcbiAgICAgIC8vIHByb21wdCByZXR1cm5zIG51bGwgaWYgY2FuY2VsbGVkIGFuZCBlbXB0eSBzdHJpbmcgaWYgYWNjZXB0ZWQgd2l0aCBubyBlbnRyeVxuICAgICAgaWYgKHByb21wdFJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgICAhdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cHJvbXB0JywgeyBwcm9tcHQ6IHByb21wdFJlc3BvbnNlLCB0YXJnZXQgfSkpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybVF1ZXN0aW9uICYmICFjb25maXJtZWQpIHtcbiAgICAgIGlmICghY29uZmlybShjb25maXJtUXVlc3Rpb24pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHRSZXNwb25zZSlcblxuICAgIGlmICh2ZXJiICE9PSAnZ2V0JyAmJiAhdXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICB9XG5cbiAgICBpZiAoZXRjLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMgPSBtZXJnZU9iamVjdHMoaGVhZGVycywgZXRjLmhlYWRlcnMpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpXG4gICAgbGV0IGVycm9ycyA9IHJlc3VsdHMuZXJyb3JzXG4gICAgY29uc3QgcmF3Rm9ybURhdGEgPSByZXN1bHRzLmZvcm1EYXRhXG4gICAgaWYgKGV0Yy52YWx1ZXMpIHtcbiAgICAgIG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGZvcm1EYXRhRnJvbU9iamVjdChldGMudmFsdWVzKSlcbiAgICB9XG4gICAgY29uc3QgZXhwcmVzc2lvblZhcnMgPSBmb3JtRGF0YUZyb21PYmplY3QoZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSlcbiAgICBjb25zdCBhbGxGb3JtRGF0YSA9IG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGV4cHJlc3Npb25WYXJzKVxuICAgIGxldCBmaWx0ZXJlZEZvcm1EYXRhID0gZmlsdGVyVmFsdWVzKGFsbEZvcm1EYXRhLCBlbHQpXG5cbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSAmJiB2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgZmlsdGVyZWRGb3JtRGF0YS5zZXQoJ29yZy5odG14LmNhY2hlLWJ1c3RlcicsIGdldFJhd0F0dHJpYnV0ZSh0YXJnZXQsICdpZCcpIHx8ICd0cnVlJylcbiAgICB9XG5cbiAgICAvLyBiZWhhdmlvciBvZiBhbmNob3JzIHcvIGVtcHR5IGhyZWYgaXMgdG8gdXNlIHRoZSBjdXJyZW50IFVSTFxuICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aCA9PT0gJycpIHtcbiAgICAgIHBhdGggPSBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtub0hlYWRlcnNdXG4gICAgICovXG4gICAgY29uc3QgcmVxdWVzdEF0dHJWYWx1ZXMgPSBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXJlcXVlc3QnKVxuXG4gICAgY29uc3QgZWx0SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHVzZVVybFBhcmFtcyA9IGh0bXguY29uZmlnLm1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zLmluZGV4T2YodmVyYikgPj0gMFxuXG4gICAgLyoqIEB0eXBlIEh0bXhSZXF1ZXN0Q29uZmlnICovXG4gICAgY29uc3QgcmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHVzZVVybFBhcmFtcyxcbiAgICAgIGZvcm1EYXRhOiBmaWx0ZXJlZEZvcm1EYXRhLFxuICAgICAgcGFyYW1ldGVyczogZm9ybURhdGFQcm94eShmaWx0ZXJlZEZvcm1EYXRhKSxcbiAgICAgIHVuZmlsdGVyZWRGb3JtRGF0YTogYWxsRm9ybURhdGEsXG4gICAgICB1bmZpbHRlcmVkUGFyYW1ldGVyczogZm9ybURhdGFQcm94eShhbGxGb3JtRGF0YSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdmVyYixcbiAgICAgIGVycm9ycyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogZXRjLmNyZWRlbnRpYWxzIHx8IHJlcXVlc3RBdHRyVmFsdWVzLmNyZWRlbnRpYWxzIHx8IGh0bXguY29uZmlnLndpdGhDcmVkZW50aWFscyxcbiAgICAgIHRpbWVvdXQ6IGV0Yy50aW1lb3V0IHx8IHJlcXVlc3RBdHRyVmFsdWVzLnRpbWVvdXQgfHwgaHRteC5jb25maWcudGltZW91dCxcbiAgICAgIHBhdGgsXG4gICAgICB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50XG4gICAgfVxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maWdSZXF1ZXN0JywgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICAvLyBjb3B5IG91dCBpbiBjYXNlIHRoZSBvYmplY3Qgd2FzIG92ZXJ3cml0dGVuXG4gICAgcGF0aCA9IHJlcXVlc3RDb25maWcucGF0aFxuICAgIHZlcmIgPSByZXF1ZXN0Q29uZmlnLnZlcmJcbiAgICBoZWFkZXJzID0gcmVxdWVzdENvbmZpZy5oZWFkZXJzXG4gICAgZmlsdGVyZWRGb3JtRGF0YSA9IGZvcm1EYXRhRnJvbU9iamVjdChyZXF1ZXN0Q29uZmlnLnBhcmFtZXRlcnMpXG4gICAgZXJyb3JzID0gcmVxdWVzdENvbmZpZy5lcnJvcnNcbiAgICB1c2VVcmxQYXJhbXMgPSByZXF1ZXN0Q29uZmlnLnVzZVVybFBhcmFtc1xuXG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGlvbjpoYWx0ZWQnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0UGF0aCA9IHBhdGguc3BsaXQoJyMnKVxuICAgIGNvbnN0IHBhdGhOb0FuY2hvciA9IHNwbGl0UGF0aFswXVxuICAgIGNvbnN0IGFuY2hvciA9IHNwbGl0UGF0aFsxXVxuXG4gICAgbGV0IGZpbmFsUGF0aCA9IHBhdGhcbiAgICBpZiAodXNlVXJsUGFyYW1zKSB7XG4gICAgICBmaW5hbFBhdGggPSBwYXRoTm9BbmNob3JcbiAgICAgIGNvbnN0IGhhc1ZhbHVlcyA9ICFmaWx0ZXJlZEZvcm1EYXRhLmtleXMoKS5uZXh0KCkuZG9uZVxuICAgICAgaWYgKGhhc1ZhbHVlcykge1xuICAgICAgICBpZiAoZmluYWxQYXRoLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJz8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcmJ1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsUGF0aCArPSB1cmxFbmNvZGUoZmlsdGVyZWRGb3JtRGF0YSlcbiAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnIycgKyBhbmNob3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdmVyaWZ5UGF0aChlbHQsIGZpbmFsUGF0aCwgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6aW52YWxpZFBhdGgnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgeGhyLm9wZW4odmVyYi50b1VwcGVyQ2FzZSgpLCBmaW5hbFBhdGgsIHRydWUpXG4gICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvaHRtbCcpXG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHJlcXVlc3RDb25maWcud2l0aENyZWRlbnRpYWxzXG4gICAgeGhyLnRpbWVvdXQgPSByZXF1ZXN0Q29uZmlnLnRpbWVvdXRcblxuICAgIC8vIHJlcXVlc3QgaGVhZGVyc1xuICAgIGlmIChyZXF1ZXN0QXR0clZhbHVlcy5ub0hlYWRlcnMpIHtcbiAgICAvLyBpZ25vcmUgYWxsIGhlYWRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlcl1cbiAgICAgICAgICBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0h0bXhSZXNwb25zZUluZm99ICovXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvID0ge1xuICAgICAgeGhyLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcmVxdWVzdENvbmZpZyxcbiAgICAgIGV0YyxcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHNlbGVjdCxcbiAgICAgIHBhdGhJbmZvOiB7XG4gICAgICAgIHJlcXVlc3RQYXRoOiBwYXRoLFxuICAgICAgICBmaW5hbFJlcXVlc3RQYXRoOiBmaW5hbFBhdGgsXG4gICAgICAgIHJlc3BvbnNlUGF0aDogbnVsbCxcbiAgICAgICAgYW5jaG9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGllcmFyY2h5ID0gaGllcmFyY2h5Rm9yRWx0KGVsdClcbiAgICAgICAgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aCA9IGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKVxuICAgICAgICByZXNwb25zZUhhbmRsZXIoZWx0LCByZXNwb25zZUluZm8pXG4gICAgICAgIGlmIChyZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgIT09IHRydWUpIHtcbiAgICAgICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAvLyBpZiB0aGUgYm9keSBubyBsb25nZXIgY29udGFpbnMgdGhlIGVsZW1lbnQsIHRyaWdnZXIgdGhlIGV2ZW50IG9uIHRoZSBjbG9zZXN0IHBhcmVudFxuICAgICAgICAvLyByZW1haW5pbmcgaW4gdGhlIERPTVxuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgbGV0IHNlY29uZGFyeVRyaWdnZXJFbHQgPSBudWxsXG4gICAgICAgICAgd2hpbGUgKGhpZXJhcmNoeS5sZW5ndGggPiAwICYmIHNlY29uZGFyeVRyaWdnZXJFbHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50RWx0SW5IaWVyYXJjaHkgPSBoaWVyYXJjaHkuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKGJvZHlDb250YWlucyhwYXJlbnRFbHRJbkhpZXJhcmNoeSkpIHtcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IHBhcmVudEVsdEluSGllcmFyY2h5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWNvbmRhcnlUcmlnZ2VyRWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14Om9uTG9hZEVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgdGhyb3cgZVxuICAgICAgfVxuICAgIH1cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRBYm9ydCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRpbWVvdXQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVJlcXVlc3QnLCByZXNwb25zZUluZm8pKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIHZhciBpbmRpY2F0b3JzID0gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KVxuICAgIHZhciBkaXNhYmxlRWx0cyA9IGRpc2FibGVFbGVtZW50cyhlbHQpXG5cbiAgICBmb3JFYWNoKFsnbG9hZHN0YXJ0JywgJ2xvYWRlbmQnLCAncHJvZ3Jlc3MnLCAnYWJvcnQnXSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBmb3JFYWNoKFt4aHIsIHhoci51cGxvYWRdLCBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnhocjonICsgZXZlbnROYW1lLCB7XG4gICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudC5sZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogZXZlbnQudG90YWxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVNlbmQnLCByZXNwb25zZUluZm8pXG4gICAgY29uc3QgcGFyYW1zID0gdXNlVXJsUGFyYW1zID8gbnVsbCA6IGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkRm9ybURhdGEpXG4gICAgeGhyLnNlbmQocGFyYW1zKVxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlVcGRhdGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3R5cGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFtwYXRoXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICogQHJldHVybiB7SHRteEhpc3RvcnlVcGRhdGV9XG4gICAqL1xuICBmdW5jdGlvbiBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBGaXJzdCBjb25zdWx0IHJlc3BvbnNlIGhlYWRlcnNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IHBhdGhGcm9tSGVhZGVycyA9IG51bGxcbiAgICBsZXQgdHlwZUZyb21IZWFkZXJzID0gbnVsbFxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaC1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVwbGFjZS1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlcGxhY2UtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdyZXBsYWNlJ1xuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIHdhcyBhIHJlc3BvbnNlIGhlYWRlciwgdGhhdCBoYXMgcHJpb3JpdHlcbiAgICBpZiAocGF0aEZyb21IZWFkZXJzKSB7XG4gICAgICBpZiAocGF0aEZyb21IZWFkZXJzID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0eXBlRnJvbUhlYWRlcnMsXG4gICAgICAgICAgcGF0aDogcGF0aEZyb21IZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTmV4dCByZXNvbHZlIHZpYSBET00gdmFsdWVzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmZpbmFsUmVxdWVzdFBhdGhcbiAgICBjb25zdCByZXNwb25zZVBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoXG5cbiAgICBjb25zdCBwdXNoVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXB1c2gtdXJsJylcbiAgICBjb25zdCByZXBsYWNlVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXJlcGxhY2UtdXJsJylcbiAgICBjb25zdCBlbGVtZW50SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHNhdmVUeXBlID0gbnVsbFxuICAgIGxldCBwYXRoID0gbnVsbFxuXG4gICAgaWYgKHB1c2hVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcHVzaFVybFxuICAgIH0gZWxzZSBpZiAocmVwbGFjZVVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncmVwbGFjZSdcbiAgICAgIHBhdGggPSByZXBsYWNlVXJsXG4gICAgfSBlbHNlIGlmIChlbGVtZW50SXNCb29zdGVkKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgIC8vIGZhbHNlIGluZGljYXRlcyBubyBwdXNoLCByZXR1cm4gZW1wdHkgb2JqZWN0XG4gICAgICBpZiAocGF0aCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgLy8gdHJ1ZSBpbmRpY2F0ZXMgd2Ugd2FudCB0byBmb2xsb3cgd2hlcmV2ZXIgdGhlIHNlcnZlciBlbmRlZCB1cCBzZW5kaW5nIHVzXG4gICAgICBpZiAocGF0aCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgICB9XG5cbiAgICAgIC8vIHJlc3RvcmUgYW55IGFuY2hvciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RcbiAgICAgIGlmIChyZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yICYmIHBhdGguaW5kZXhPZignIycpID09PSAtMSkge1xuICAgICAgICBwYXRoID0gcGF0aCArICcjJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogc2F2ZVR5cGUsXG4gICAgICAgIHBhdGhcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9IHJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0NvbmZpZywgc3RhdHVzKSB7XG4gICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVzcG9uc2VIYW5kbGluZ0NvbmZpZy5jb2RlKVxuICAgIHJldHVybiByZWdFeHAudGVzdChzdGF0dXMudG9TdHJpbmcoMTApKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ31cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnICovXG4gICAgICB2YXIgcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQgPSBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nW2ldXG4gICAgICBpZiAoY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQsIHhoci5zdGF0dXMpKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUhhbmRsaW5nRWxlbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBubyBtYXRjaGVzLCByZXR1cm4gbm8gc3dhcFxuICAgIHJldHVybiB7XG4gICAgICBzd2FwOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRpdGxlKHRpdGxlKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBjb25zdCB0aXRsZUVsdCA9IGZpbmQoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsdCkge1xuICAgICAgICB0aXRsZUVsdC5pbm5lckhUTUwgPSB0aXRsZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnRpdGxlID0gdGl0bGVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUFqYXhSZXNwb25zZShlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcbiAgICBsZXQgdGFyZ2V0ID0gcmVzcG9uc2VJbmZvLnRhcmdldFxuICAgIGNvbnN0IGV0YyA9IHJlc3BvbnNlSW5mby5ldGNcbiAgICBjb25zdCByZXNwb25zZUluZm9TZWxlY3QgPSByZXNwb25zZUluZm8uc2VsZWN0XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZU9uTG9hZCcsIHJlc3BvbnNlSW5mbykpIHJldHVyblxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyOi9pKSkge1xuICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyJywgZWx0KVxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtTG9jYXRpb246L2kpKSB7XG4gICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgbGV0IHJlZGlyZWN0UGF0aCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtTG9jYXRpb24nKVxuICAgICAgLyoqIEB0eXBlIHtIdG14QWpheEhlbHBlckNvbnRleHQme3BhdGg6c3RyaW5nfX0gKi9cbiAgICAgIHZhciByZWRpcmVjdFN3YXBTcGVjXG4gICAgICBpZiAocmVkaXJlY3RQYXRoLmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgICByZWRpcmVjdFN3YXBTcGVjID0gcGFyc2VKU09OKHJlZGlyZWN0UGF0aClcbiAgICAgICAgLy8gd2hhdCdzIHRoZSBiZXN0IHdheSB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdXNlciBkaWRuJ3QgaW5jbHVkZSB0aGlzXG4gICAgICAgIHJlZGlyZWN0UGF0aCA9IHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgICBkZWxldGUgcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICB9XG4gICAgICBhamF4SGVscGVyKCdnZXQnLCByZWRpcmVjdFBhdGgsIHJlZGlyZWN0U3dhcFNwZWMpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShyZWRpcmVjdFBhdGgpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUmVmcmVzaCA9IGhhc0hlYWRlcih4aHIsIC9IWC1SZWZyZXNoOi9pKSAmJiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZnJlc2gnKSA9PT0gJ3RydWUnXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlZGlyZWN0Oi9pKSkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24uaHJlZiA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVkaXJlY3QnKVxuICAgICAgc2hvdWxkUmVmcmVzaCAmJiBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlZnJlc2gpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGlzdG9yeVVwZGF0ZSA9IGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKVxuXG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGluZyA9IHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocilcbiAgICBjb25zdCBzaG91bGRTd2FwID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwXG4gICAgbGV0IGlzRXJyb3IgPSAhIXJlc3BvbnNlSGFuZGxpbmcuZXJyb3JcbiAgICBsZXQgaWdub3JlVGl0bGUgPSBodG14LmNvbmZpZy5pZ25vcmVUaXRsZSB8fCByZXNwb25zZUhhbmRsaW5nLmlnbm9yZVRpdGxlXG4gICAgbGV0IHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zZWxlY3RcbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy50YXJnZXQpIHtcbiAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSlcbiAgICB9XG4gICAgdmFyIHN3YXBPdmVycmlkZSA9IGV0Yy5zd2FwT3ZlcnJpZGVcbiAgICBpZiAoc3dhcE92ZXJyaWRlID09IG51bGwgJiYgcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGUpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlXG4gICAgfVxuXG4gICAgLy8gcmVzcG9uc2UgaGVhZGVycyBvdmVycmlkZSByZXNwb25zZSBoYW5kbGluZyBjb25maWdcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgIH1cblxuICAgIHZhciBzZXJ2ZXJSZXNwb25zZSA9IHhoci5yZXNwb25zZVxuICAgIC8qKiBAdHlwZSBIdG14QmVmb3JlU3dhcERldGFpbHMgKi9cbiAgICB2YXIgYmVmb3JlU3dhcERldGFpbHMgPSBtZXJnZU9iamVjdHMoe1xuICAgICAgc2hvdWxkU3dhcCxcbiAgICAgIHNlcnZlclJlc3BvbnNlLFxuICAgICAgaXNFcnJvcixcbiAgICAgIGlnbm9yZVRpdGxlLFxuICAgICAgc2VsZWN0T3ZlcnJpZGVcbiAgICB9LCByZXNwb25zZUluZm8pXG5cbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy5ldmVudCAmJiAhdHJpZ2dlckV2ZW50KHRhcmdldCwgcmVzcG9uc2VIYW5kbGluZy5ldmVudCwgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6YmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgc2VydmVyUmVzcG9uc2UgPSBiZWZvcmVTd2FwRGV0YWlscy5zZXJ2ZXJSZXNwb25zZSAvLyBhbGxvdyB1cGRhdGluZyBjb250ZW50XG4gICAgaXNFcnJvciA9IGJlZm9yZVN3YXBEZXRhaWxzLmlzRXJyb3IgLy8gYWxsb3cgdXBkYXRpbmcgZXJyb3JcbiAgICBpZ25vcmVUaXRsZSA9IGJlZm9yZVN3YXBEZXRhaWxzLmlnbm9yZVRpdGxlIC8vIGFsbG93IHVwZGF0aW5nIGlnbm9yaW5nIHRpdGxlXG4gICAgc2VsZWN0T3ZlcnJpZGUgPSBiZWZvcmVTd2FwRGV0YWlscy5zZWxlY3RPdmVycmlkZSAvLyBhbGxvdyB1cGRhdGluZyBzZWxlY3Qgb3ZlcnJpZGVcblxuICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSB0YXJnZXQgLy8gTWFrZSB1cGRhdGVkIHRhcmdldCBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLmZhaWxlZCA9IGlzRXJyb3IgLy8gTWFrZSBmYWlsZWQgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5zdWNjZXNzZnVsID0gIWlzRXJyb3IgLy8gTWFrZSBzdWNjZXNzZnVsIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcblxuICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjg2KSB7XG4gICAgICAgIGNhbmNlbFBvbGxpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IGV4dGVuc2lvbi50cmFuc2Zvcm1SZXNwb25zZShzZXJ2ZXJSZXNwb25zZSwgeGhyLCBlbHQpXG4gICAgICB9KVxuXG4gICAgICAvLyBTYXZlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSB3aWxsIGJlIGEgaGlzdG9yeSB1cGRhdGVcbiAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICAgIH1cbiAgICAgIHZhciBzd2FwU3BlYyA9IGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcE92ZXJyaWRlKVxuXG4gICAgICBpZiAoIXN3YXBTcGVjLmhhc093blByb3BlcnR5KCdpZ25vcmVUaXRsZScpKSB7XG4gICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gaWdub3JlVGl0bGVcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcblxuICAgICAgLy8gb3B0aW9uYWwgdHJhbnNpdGlvbiBBUEkgcHJvbWlzZSBjYWxsYmFja3NcbiAgICAgIGxldCBzZXR0bGVSZXNvbHZlID0gbnVsbFxuICAgICAgbGV0IHNldHRsZVJlamVjdCA9IG51bGxcblxuICAgICAgaWYgKHJlc3BvbnNlSW5mb1NlbGVjdCkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSW5mb1NlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc2VsZWN0Oi9pKSkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzZWxlY3QnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3RPT0IgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0LW9vYicpXG4gICAgICBjb25zdCBzZWxlY3QgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0JylcblxuICAgICAgbGV0IGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGlmIHdlIG5lZWQgdG8gc2F2ZSBoaXN0b3J5LCBkbyBzbywgYmVmb3JlIHN3YXBwaW5nIHNvIHRoYXQgcmVsYXRpdmUgcmVzb3VyY2VzIGhhdmUgdGhlIGNvcnJlY3QgYmFzZSBVUkxcbiAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5VXBkYXRlJywgbWVyZ2VPYmplY3RzKHsgaGlzdG9yeTogaGlzdG9yeVVwZGF0ZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnB1c2hlZEludG9IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VVcmxJbkhpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpyZXBsYWNlZEluSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dhcCh0YXJnZXQsIHNlcnZlclJlc3BvbnNlLCBzd2FwU3BlYywge1xuICAgICAgICAgICAgc2VsZWN0OiBzZWxlY3RPdmVycmlkZSB8fCBzZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3RPT0IsXG4gICAgICAgICAgICBldmVudEluZm86IHJlc3BvbnNlSW5mbyxcbiAgICAgICAgICAgIGFuY2hvcjogcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvcixcbiAgICAgICAgICAgIGNvbnRleHRFbGVtZW50OiBlbHQsXG4gICAgICAgICAgICBhZnRlclN3YXBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1Td2FwOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1Td2FwJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlclNldHRsZUNhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVNldHRsZTovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlc29sdmUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3dhcEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZWplY3QpXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBzaG91bGRUcmFuc2l0aW9uID0gaHRteC5jb25maWcuZ2xvYmFsVmlld1RyYW5zaXRpb25zXG4gICAgICBpZiAoc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ3RyYW5zaXRpb24nKSkge1xuICAgICAgICBzaG91bGRUcmFuc2l0aW9uID0gc3dhcFNwZWMudHJhbnNpdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVUcmFuc2l0aW9uJywgcmVzcG9uc2VJbmZvKSAmJlxuICAgICAgICAgICAgICB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBjb25zdCBzZXR0bGVQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgICBzZXR0bGVSZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgICBzZXR0bGVSZWplY3QgPSBfcmVqZWN0XG4gICAgICAgIH0pXG4gICAgICAgIC8vIHdyYXAgdGhlIG9yaWdpbmFsIGRvU3dhcCgpIGluIGEgY2FsbCB0byBzdGFydFZpZXdUcmFuc2l0aW9uKClcbiAgICAgICAgY29uc3QgaW5uZXJEb1N3YXAgPSBkb1N3YXBcbiAgICAgICAgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5uZXJEb1N3YXAoKVxuICAgICAgICAgICAgcmV0dXJuIHNldHRsZVByb21pc2VcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzd2FwU3BlYy5zd2FwRGVsYXkgPiAwKSB7XG4gICAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9Td2FwLCBzd2FwU3BlYy5zd2FwRGVsYXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1N3YXAoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNFcnJvcikge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpyZXNwb25zZUVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6ICdSZXNwb25zZSBTdGF0dXMgRXJyb3IgQ29kZSAnICsgeGhyLnN0YXR1cyArICcgZnJvbSAnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlcXVlc3RQYXRoIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXh0ZW5zaW9ucyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIEh0bXhFeHRlbnNpb24+fSAqL1xuICBjb25zdCBleHRlbnNpb25zID0ge31cblxuICAvKipcbiAgICogZXh0ZW5zaW9uQmFzZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYWxsIGV4dGVuc2lvbnMuXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZXh0ZW5zaW9uQmFzZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5pdDogZnVuY3Rpb24oYXBpKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgb25FdmVudDogZnVuY3Rpb24obmFtZSwgZXZ0KSB7IHJldHVybiB0cnVlIH0sXG4gICAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24odGV4dCwgeGhyLCBlbHQpIHsgcmV0dXJuIHRleHQgfSxcbiAgICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgaGFuZGxlU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24oeGhyLCBwYXJhbWV0ZXJzLCBlbHQpIHsgcmV0dXJuIG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZWZpbmVFeHRlbnNpb24gaW5pdGlhbGl6ZXMgdGhlIGV4dGVuc2lvbiBhbmQgYWRkcyBpdCB0byB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNkZWZpbmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbn0gZXh0ZW5zaW9uIHRoZSBleHRlbnNpb24gZGVmaW5pdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gZGVmaW5lRXh0ZW5zaW9uKG5hbWUsIGV4dGVuc2lvbikge1xuICAgIGlmIChleHRlbnNpb24uaW5pdCkge1xuICAgICAgZXh0ZW5zaW9uLmluaXQoaW50ZXJuYWxBUEkpXG4gICAgfVxuICAgIGV4dGVuc2lvbnNbbmFtZV0gPSBtZXJnZU9iamVjdHMoZXh0ZW5zaW9uQmFzZSgpLCBleHRlbnNpb24pXG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlRXh0ZW5zaW9uIHJlbW92ZXMgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFeHRlbnNpb24obmFtZSkge1xuICAgIGRlbGV0ZSBleHRlbnNpb25zW25hbWVdXG4gIH1cblxuICAvKipcbiAgICogZ2V0RXh0ZW5zaW9ucyBzZWFyY2hlcyB1cCB0aGUgRE9NIHRyZWUgdG8gcmV0dXJuIGFsbCBleHRlbnNpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbltdPX0gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nW109fSBleHRlbnNpb25zVG9JZ25vcmVcbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEV4dGVuc2lvbnMoZWx0LCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSkge1xuICAgIGlmIChleHRlbnNpb25zVG9SZXR1cm4gPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9SZXR1cm4gPSBbXVxuICAgIH1cbiAgICBpZiAoZWx0ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbnNUb1JldHVyblxuICAgIH1cbiAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlID0gW11cbiAgICB9XG4gICAgY29uc3QgZXh0ZW5zaW9uc0ZvckVsZW1lbnQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1leHQnKVxuICAgIGlmIChleHRlbnNpb25zRm9yRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChleHRlbnNpb25zRm9yRWxlbWVudC5zcGxpdCgnLCcpLCBmdW5jdGlvbihleHRlbnNpb25OYW1lKSB7XG4gICAgICAgIGV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb25OYW1lLnJlcGxhY2UoLyAvZywgJycpXG4gICAgICAgIGlmIChleHRlbnNpb25OYW1lLnNsaWNlKDAsIDcpID09ICdpZ25vcmU6Jykge1xuICAgICAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZS5wdXNoKGV4dGVuc2lvbk5hbWUuc2xpY2UoNykpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZS5pbmRleE9mKGV4dGVuc2lvbk5hbWUpIDwgMCkge1xuICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uTmFtZV1cbiAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmIGV4dGVuc2lvbnNUb1JldHVybi5pbmRleE9mKGV4dGVuc2lvbikgPCAwKSB7XG4gICAgICAgICAgICBleHRlbnNpb25zVG9SZXR1cm4ucHVzaChleHRlbnNpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEluaXRpYWxpemF0aW9uXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpc1JlYWR5ID0gZmFsc2VcbiAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgaXNSZWFkeSA9IHRydWVcbiAgfSlcblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIG5vdyBpZiBET01Db250ZW50TG9hZGVkIGhhcyBmaXJlZCwgb3RoZXJ3aXNlIGxpc3RlbiBmb3IgaXQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdXNlcyBpc1JlYWR5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGFzayB0aGUgYnJvd3NlciB3aGV0aGVyXG4gICAqIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gZmlyZWQ7IHRoZXJlJ3MgYSBnYXAgYmV0d2VlbiBET01Db250ZW50TG9hZGVkXG4gICAqIGZpcmluZyBhbmQgcmVhZHlzdGF0ZT1jb21wbGV0ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWR5KGZuKSB7XG4gICAgLy8gQ2hlY2tpbmcgcmVhZHlTdGF0ZSBoZXJlIGlzIGEgZmFpbHNhZmUgaW4gY2FzZSB0aGUgaHRteCBzY3JpcHQgdGFnIGVudGVyZWQgdGhlIERPTSBieVxuICAgIC8vIHNvbWUgbWVhbnMgb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQuXG4gICAgaWYgKGlzUmVhZHkgfHwgZ2V0RG9jdW1lbnQoKS5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICBmbigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydEluZGljYXRvclN0eWxlcygpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaW5jbHVkZUluZGljYXRvclN0eWxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG5vbmNlQXR0cmlidXRlID0gaHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZSA/IGAgbm9uY2U9XCIke2h0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2V9XCJgIDogJydcbiAgICAgIGdldERvY3VtZW50KCkuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsXG4gICAgICAgICc8c3R5bGUnICsgbm9uY2VBdHRyaWJ1dGUgKyAnPlxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjB9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJyAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJy4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgPC9zdHlsZT4nKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1ldGFDb25maWcoKSB7XG4gICAgLyoqIEB0eXBlIEhUTUxNZXRhRWxlbWVudCAqL1xuICAgIGNvbnN0IGVsZW1lbnQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImh0bXgtY29uZmlnXCJdJylcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHBhcnNlSlNPTihlbGVtZW50LmNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VNZXRhQ29uZmlnKCkge1xuICAgIGNvbnN0IG1ldGFDb25maWcgPSBnZXRNZXRhQ29uZmlnKClcbiAgICBpZiAobWV0YUNvbmZpZykge1xuICAgICAgaHRteC5jb25maWcgPSBtZXJnZU9iamVjdHMoaHRteC5jb25maWcsIG1ldGFDb25maWcpXG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnRcbiAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgbWVyZ2VNZXRhQ29uZmlnKClcbiAgICBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKVxuICAgIGxldCBib2R5ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgcHJvY2Vzc05vZGUoYm9keSlcbiAgICBjb25zdCByZXN0b3JlZEVsdHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIltoeC10cmlnZ2VyPSdyZXN0b3JlZCddLFtkYXRhLWh4LXRyaWdnZXI9J3Jlc3RvcmVkJ11cIlxuICAgIClcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWJvcnQnLCBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXRcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YSh0YXJnZXQpXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhICYmIGludGVybmFsRGF0YS54aHIpIHtcbiAgICAgICAgaW50ZXJuYWxEYXRhLnhoci5hYm9ydCgpXG4gICAgICB9XG4gICAgfSlcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIGNvbnN0IG9yaWdpbmFsUG9wc3RhdGUgPSB3aW5kb3cub25wb3BzdGF0ZSA/IHdpbmRvdy5vbnBvcHN0YXRlLmJpbmQod2luZG93KSA6IG51bGxcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5zdGF0ZSAmJiBldmVudC5zdGF0ZS5odG14KSB7XG4gICAgICAgIHJlc3RvcmVIaXN0b3J5KClcbiAgICAgICAgZm9yRWFjaChyZXN0b3JlZEVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnJlc3RvcmVkJywge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGdldERvY3VtZW50KCksXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsUG9wc3RhdGUpIHtcbiAgICAgICAgICBvcmlnaW5hbFBvcHN0YXRlKGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoYm9keSwgJ2h0bXg6bG9hZCcsIHt9KSAvLyBnaXZlIHJlYWR5IGhhbmRsZXJzIGEgY2hhbmNlIHRvIGxvYWQgdXAgYmVmb3JlIGZpcmluZyB0aGlzIGV2ZW50XG4gICAgICBib2R5ID0gbnVsbCAvLyBraWxsIHJlZmVyZW5jZSBmb3IgZ2NcbiAgICB9LCAwKVxuICB9KVxuXG4gIHJldHVybiBodG14XG59KSgpXG5cbi8qKiBAdHlwZWRlZiB7J2dldCd8J2hlYWQnfCdwb3N0J3wncHV0J3wnZGVsZXRlJ3wnY29ubmVjdCd8J29wdGlvbnMnfCd0cmFjZSd8J3BhdGNoJ30gSHR0cFZlcmIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2FwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdE9PQl1cbiAqIEBwcm9wZXJ0eSB7Kn0gW2V2ZW50SW5mb11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYW5jaG9yXVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbY29udGV4dEVsZW1lbnRdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU3dhcENhbGxiYWNrXVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclNldHRsZUNhbGxiYWNrXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHN3YXBDYWxsYmFja1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeydpbm5lckhUTUwnIHwgJ291dGVySFRNTCcgfCAnYmVmb3JlYmVnaW4nIHwgJ2FmdGVyYmVnaW4nIHwgJ2JlZm9yZWVuZCcgfCAnYWZ0ZXJlbmQnIHwgJ2RlbGV0ZScgfCAnbm9uZScgfCBzdHJpbmd9IEh0bXhTd2FwU3R5bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEh0bXhTd2FwU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzd2FwRGVsYXlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZXR0bGVEZWxheVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJhbnNpdGlvbl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoZWFkXVxuICogQHByb3BlcnR5IHsndG9wJyB8ICdib3R0b20nfSBbc2Nyb2xsXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JvbGxUYXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3ddXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3dUYXJnZXRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb2N1c1Njcm9sbF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKHRoaXM6Tm9kZSwgZXZ0OkV2ZW50KSA9PiBib29sZWFuKSAmIHtzb3VyY2U6IHN0cmluZ319IENvbmRpdGlvbmFsRnVuY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9sbEludGVydmFsXVxuICogQHByb3BlcnR5IHtDb25kaXRpb25hbEZ1bmN0aW9ufSBbZXZlbnRGaWx0ZXJdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjaGFuZ2VkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbb25jZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnN1bWVdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmcm9tXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Rocm90dGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9vdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyZXNob2xkXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tlbHQ6IEVsZW1lbnQsIG1lc3NhZ2U6IHN0cmluZywgdmFsaWRpdHk6IFZhbGlkaXR5U3RhdGV9fSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gSFgtUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlclxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlci1OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UYXJnZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIWC1DdXJyZW50LVVSTFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtIWC1Qcm9tcHRdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUJvb3N0ZWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0NvbnRlbnQtVHlwZV1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3RdXG4gKi9cblxuLyoqIEB0eXBlZGVmIEh0bXhBamF4SGVscGVyQ29udGV4dFxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3NvdXJjZV1cbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IFtldmVudF1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlVXJsUGFyYW1zXG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHBhcmFtZXRlcnMgZm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IHVuZmlsdGVyZWRGb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHVuZmlsdGVyZWRQYXJhbWV0ZXJzIHVuZmlsdGVyZWRGb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn0gaGVhZGVyc1xuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEBwcm9wZXJ0eSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpdGhDcmVkZW50aWFsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoXG4gKiBAcHJvcGVydHkge0V2ZW50fSB0cmlnZ2VyaW5nRXZlbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUluZm9cbiAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhFdGN9IGV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VsZWN0XG4gKiBAcHJvcGVydHkge3tyZXF1ZXN0UGF0aDogc3RyaW5nLCBmaW5hbFJlcXVlc3RQYXRoOiBzdHJpbmcsIHJlc3BvbnNlUGF0aDogc3RyaW5nfG51bGwsIGFuY2hvcjogc3RyaW5nfX0gcGF0aEluZm9cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N1Y2Nlc3NmdWxdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtrZWVwSW5kaWNhdG9yc11cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhBamF4RXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXR1cm5Qcm9taXNlXVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFt0YXJnZXRPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2RlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBzd2FwXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlcnJvcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtldmVudF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIdG14UmVzcG9uc2VJbmZvICYge3Nob3VsZFN3YXA6IGJvb2xlYW4sIHNlcnZlclJlc3BvbnNlOiBhbnksIGlzRXJyb3I6IGJvb2xlYW4sIGlnbm9yZVRpdGxlOiBib29sZWFuLCBzZWxlY3RPdmVycmlkZTpzdHJpbmd9fSBIdG14QmVmb3JlU3dhcERldGFpbHNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBIdG14QWpheEhhbmRsZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygoKSA9PiB2b2lkKX0gSHRteFNldHRsZVRhc2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhTZXR0bGVJbmZvXG4gKiBAcHJvcGVydHkge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gZWx0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aXRsZV1cbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgtZXh0ZW5zaW9ucy9ibG9iL21haW4vUkVBRE1FLm1kXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14RXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkgeyhhcGk6IGFueSkgPT4gdm9pZH0gaW5pdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnR8Q3VzdG9tRXZlbnQpID0+IGJvb2xlYW59IG9uRXZlbnRcbiAqIEBwcm9wZXJ0eSB7KHRleHQ6IHN0cmluZywgeGhyOiBYTUxIdHRwUmVxdWVzdCwgZWx0OiBFbGVtZW50KSA9PiBzdHJpbmd9IHRyYW5zZm9ybVJlc3BvbnNlXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpID0+IGJvb2xlYW59IGlzSW5saW5lU3dhcFxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLCB0YXJnZXQ6IE5vZGUsIGZyYWdtZW50OiBOb2RlLCBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbykgPT4gYm9vbGVhbnxOb2RlW119IGhhbmRsZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHhocjogWE1MSHR0cFJlcXVlc3QsIHBhcmFtZXRlcnM6IEZvcm1EYXRhLCBlbHQ6IE5vZGUpID0+ICp8c3RyaW5nfG51bGx9IGVuY29kZVBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nW118bnVsbH0gZ2V0U2VsZWN0b3JzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGh0bXhcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBkZXBlbmRzT24ocGF0aFNwZWM6IGFueSwgdXJsOiBzdHJpbmcpIHtcbiAgaWYgKHBhdGhTcGVjID09PSBcImlnbm9yZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGRlcGVuZGVuY3lQYXRoID0gcGF0aFNwZWMuc3BsaXQoXCIvXCIpO1xuICBjb25zdCB1cmxQYXRoID0gdXJsLnNwbGl0KFwiL1wiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeUVsZW1lbnQgPSBkZXBlbmRlbmN5UGF0aC5zaGlmdCgpO1xuICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gdXJsUGF0aFtpXTtcbiAgICBpZiAoZGVwZW5kZW5jeUVsZW1lbnQgIT09IHBhdGhFbGVtZW50ICYmIGRlcGVuZGVuY3lFbGVtZW50ICE9PSBcIipcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDAgfHxcbiAgICAgIChkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDEgJiYgZGVwZW5kZW5jeVBhdGhbMF0gPT09IFwiXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgZWx0c1dpdGhEZXBzID0gaHRteC5maW5kQWxsKFwiW3BhdGgtZGVwc11cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0c1dpdGhEZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZWx0ID0gZWx0c1dpdGhEZXBzW2ldO1xuICAgIGlmIChkZXBlbmRzT24oZWx0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSwgcGF0aCkpIHtcbiAgICAgIGh0bXgudHJpZ2dlcihlbHQsIFwicGF0aC1kZXBzXCIsIG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInBhdGgtZGVwc1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmJlZm9yZU9uTG9hZFwiKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBldnQuZGV0YWlsLnJlcXVlc3RDb25maWc7XG4gICAgICAvLyBtdXRhdGluZyBjYWxsXG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZyAmJlxuICAgICAgICBjb25maWcudmVyYiAhPT0gXCJnZXRcIiAmJlxuICAgICAgICBldnQudGFyZ2V0ICE9IG51bGwgJiZcbiAgICAgICAgZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgZXZ0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIikgIT09IFwiaWdub3JlXCJcbiAgICAgICkge1xuICAgICAgICByZWZyZXNoUGF0aChjb25maWcucGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCwge0h0bXhTZXR0bGVJbmZvLCBIdG14U3dhcFN0eWxlfSBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbn1cblxuY29uc3QgaWdub3JlZEV2ZW50cyA9IFsnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCAnaHRteDpiZWZvcmVTd2FwJywgJ2h0bXg6YWZ0ZXJTd2FwJywgJ2h0bXg6YmVmb3JlT25Mb2FkJywgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCAnaHRteDpjb25maWdSZXF1ZXN0JywgJ2h0bXg6Y29uZmlnUmVzcG9uc2UnLCAnaHRteDpyZXNwb25zZUVycm9yJ107XG5cbmZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWU6IHN0cmluZywgZGV0YWlsOiBhbnkpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG59XG5cbmZ1bmN0aW9uIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQ6IEhUTUxFbGVtZW50LCBuYW1lOiBzdHJpbmcsIGV2ZW50OiBDdXN0b21FdmVudCwgdHJpZ2dlcmVkOiBTZXQ8SFRNTEVsZW1lbnQ+KSB7XG4gICAgaWYoaWdub3JlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY2hpbGRyZW4pIHtcbiAgICAgICAgQXJyYXkuZnJvbSh0YXJnZXQuY2hpbGRyZW4pLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtlaGFiID0ga2ViYWJFdmVudE5hbWUobmFtZSk7XG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBrZWhhYi5yZXBsYWNlKFwiaHRteDpcIiwgXCJoeC1vbjo6XCIpXG4gICAgICAgICAgICBpZiAoIXRyaWdnZXJlZC5oYXMoZSBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBpZihlLmhhc0F0dHJpYnV0ZShldmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZS5yZXBsYWNlKFwiaHgtb246OlwiLCBcImh0bXg6XCIpLCBldmVudC5kZXRhaWwpXG4gICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmRldGFpbC5tZXRhID0gJ3RyaWdnZXItY2hpbGRyZW4nXG4gICAgICAgICAgICAgICAgICAgIGUuZGlzcGF0Y2hFdmVudChuZXdFdmVudClcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkLmFkZChlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoaWxkcmVuKGUgYXMgSFRNTEVsZW1lbnQsIG5hbWUsIGV2ZW50LCB0cmlnZ2VyZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwidHJpZ2dlci1jaGlsZHJlblwiLCB7XG4gICAgb25FdmVudDogKG5hbWUsIGV2dDogRXZlbnQgfCBDdXN0b21FdmVudCkgPT4ge1xuICAgICAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZihldnQuZGV0YWlsLm1ldGEgPT09ICd0cmlnZ2VyLWNoaWxkcmVuJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyaWdnZXJlZCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfHwgZXZ0LmRldGFpbC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQsIG5hbWUsIGV2dCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpOiBhbnkpOiB2b2lkIHtcbiAgICB9LFxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbiAoXG4gICAgICAgIHRleHQ6IHN0cmluZyxcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgZWx0OiBFbGVtZW50LFxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH0sXG4gICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbiAoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uIChcbiAgICAgICAgc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLFxuICAgICAgICB0YXJnZXQ6IE5vZGUsXG4gICAgICAgIGZyYWdtZW50OiBOb2RlLFxuICAgICAgICBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbyxcbiAgICApOiBib29sZWFuIHwgTm9kZVtdIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24gKFxuICAgICAgICB4aHI6IFhNTEh0dHBSZXF1ZXN0LFxuICAgICAgICBwYXJhbWV0ZXJzOiBGb3JtRGF0YSxcbiAgICAgICAgZWx0OiBOb2RlLFxuICAgICkge1xuICAgIH0sXG4gICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbiAoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiZGVidWdcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoY29uc29sZS5kZWJ1Zykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhuYW1lLCBldnQpO1xuICAgIH0gZWxzZSBpZiAoY29uc29sZSkge1xuICAgICAgY29uc29sZS5sb2coXCJERUJVRzpcIiwgbmFtZSwgZXZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm9vcFxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5jb25zdCBjb25maWc6IGFueSA9IGh0bXguY29uZmlnO1xuXG4vKiogQHR5cGUge2ltcG9ydChcIi4uL2h0bXhcIikuSHRteEludGVybmFsQXBpfSAqL1xubGV0IGFwaTogYW55O1xuXG5jb25zdCBhdHRyUHJlZml4ID0gXCJoeC10YXJnZXQtXCI7XG5cbi8vIElFMTEgZG9lc24ndCBzdXBwb3J0IHN0cmluZy5zdGFydHNXaXRoXG5mdW5jdGlvbiBzdGFydHNXaXRoKHN0cjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZykge1xuICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHJlc3BDb2RlTnVtYmVyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfVxuICovXG5mdW5jdGlvbiBnZXRSZXNwQ29kZVRhcmdldChlbHQ6IEVsZW1lbnQsIHJlc3BDb2RlTnVtYmVyOiBudW1iZXIpIHtcbiAgaWYgKCFlbHQgfHwgIXJlc3BDb2RlTnVtYmVyKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCByZXNwQ29kZSA9IHJlc3BDb2RlTnVtYmVyLnRvU3RyaW5nKCk7XG5cbiAgLy8gJyonIGlzIHRoZSBvcmlnaW5hbCBzeW50YXgsIGFzIHRoZSBvYnZpb3VzIGNoYXJhY3RlciBmb3IgYSB3aWxkY2FyZC5cbiAgLy8gVGhlICd4JyBhbHRlcm5hdGl2ZSB3YXMgYWRkZWQgZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIEhUTUxcbiAgLy8gdGVtcGxhdGluZyBlbmdpbmVzLCBkdWUgdG8gYW1iaWd1aXR5IGFyb3VuZCB3aGljaCBjaGFyYWN0ZXJzIGFyZVxuICAvLyBzdXBwb3J0ZWQgaW4gSFRNTCBhdHRyaWJ1dGVzLlxuICAvL1xuICAvLyBTdGFydCB3aXRoIHRoZSBtb3N0IHNwZWNpZmljIHBvc3NpYmxlIGF0dHJpYnV0ZSBhbmQgZ2VuZXJhbGl6ZSBmcm9tXG4gIC8vIHRoZXJlLlxuICBjb25zdCBhdHRyUG9zc2liaWxpdGllcyA9IFtcbiAgICByZXNwQ29kZSxcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwieFwiLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4XCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieHhcIixcblxuICAgIFwiKlwiLFxuICAgIFwieFwiLFxuICAgIFwiKioqXCIsXG4gICAgXCJ4eHhcIixcbiAgXTtcbiAgaWYgKHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNFwiKSB8fCBzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjVcIikpIHtcbiAgICBhdHRyUG9zc2liaWxpdGllcy5wdXNoKFwiZXJyb3JcIik7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJQb3NzaWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXR0ciA9IGF0dHJQcmVmaXggKyBhdHRyUG9zc2liaWxpdGllc1tpXTtcbiAgICBjb25zdCBhdHRyVmFsdWUgPSBhcGkuZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cik7XG4gICAgaWYgKGF0dHJWYWx1ZSkge1xuICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gXCJ0aGlzXCIpIHtcbiAgICAgICAgcmV0dXJuIGFwaS5maW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhcGkucXVlcnlTZWxlY3RvckV4dChlbHQsIGF0dHJWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBAcGFyYW0ge0V2ZW50fSBldnQgKi9cbmZ1bmN0aW9uIGhhbmRsZUVycm9yRmxhZyhldnQ6IEN1c3RvbUV2ZW50KSB7XG4gIGlmIChldnQuZGV0YWlsLmlzRXJyb3IpIHtcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IpIHtcbiAgICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IpIHtcbiAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSB0cnVlO1xuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicmVzcG9uc2UtdGFyZ2V0c1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaW5pdDogKGFwaVJlZikgPT4ge1xuICAgIGFwaSA9IGFwaVJlZjtcblxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5hbWUgPT09IFwiaHRteDpiZWZvcmVTd2FwXCIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyICYmXG4gICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMgIT09IDIwMFxuICAgICkge1xuICAgICAgaWYgKGV2dC5kZXRhaWwudGFyZ2V0KSB7XG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcpIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgJiZcbiAgICAgICAgICBldnQuZGV0YWlsLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5tYXRjaCgvSFgtUmV0YXJnZXQ6L2kpXG4gICAgICAgICkge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0UmVzcENvZGVUYXJnZXQoXG4gICAgICAgIGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZy5lbHQsXG4gICAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyxcbiAgICAgICk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICBldnQuZGV0YWlsLnRhcmdldCA9IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibXV0YXRpb24tZXJyb3JcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDphZnRlclJlcXVlc3RcIikge1xuICAgICAgaWYgKCFldnQuZGV0YWlsIHx8ICFldnQuZGV0YWlsLnhocikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0dXMgPSBldnQuZGV0YWlsLnhoci5zdGF0dXM7XG4gICAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICBodG14LmZpbmRBbGwoXCJbaHgtb25cXFxcOlxcXFw6bXV0YXRpb24tZXJyb3JdXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgXCJodG14Om11dGF0aW9uLWVycm9yXCIsIHsgc3RhdHVzIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IHtjcmVhdGVXZWJTb2NrZXRDbGllbnR9IGZyb20gXCIuLi91dGlsL3dzXCI7XG5cbmxldCBsYXN0VmVyc2lvbiA9IFwiXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibGl2ZXJlbG9hZFwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBlbmFibGVkID0gZmFsc2VcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIEFycmF5LmZyb20oaHRteC5maW5kQWxsKFwiW2h4LWV4dF1cIikpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtZXh0XCIpO1xuICAgICAgICAgICAgaWYodmFsdWU/LnNwbGl0KFwiIFwiKS5pbmNsdWRlcyhcImxpdmVyZWxvYWRcIikpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ2xpdmVyZWxvYWQgZXh0ZW5zaW9uIGluaXRpYWxpemVkLicpO1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRXZlbnRTb3VyY2Ugb2JqZWN0IGFuZCBwb2ludCBpdCB0byB5b3VyIFNTRSBlbmRwb2ludFxuICAgICAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2Rldi9saXZlcmVsb2FkJyk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YVxuICAgICAgICAgICAgLy8gTG9nIHRoZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uICE9PSBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgIHJlbG9hZCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgKGUuZy4sIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkKVxuICAgICAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50U291cmNlIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgfTtcblxuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcblxuICAgIH0sXG59KTtcblxuZnVuY3Rpb24gcmVsb2FkKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxufSIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5jb25zdCBldmFsRnVuY1JlZ2V4ID0vX19ldmFsX1tBLVphLXowLTldK1xcKFthLXpdK1xcKS9nbVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImh0bWdvXCIsIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgIGlmKG5hbWUgPT09IFwiaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5cblxuXG5pbnRlcmZhY2UgSHRteEludGVybmFsQXBpIHtcbiAgICBnZXRJbnRlcm5hbERhdGEoZWx0OiBFbGVtZW50KTogYW55O1xuICAgIGJvZHlDb250YWlucyhlbHQ6IEVsZW1lbnQpOiBib29sZWFuO1xuICAgIGdldEF0dHJpYnV0ZVZhbHVlKGVsdDogRWxlbWVudCwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbDtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0OiBFbGVtZW50LCBuYW1lOiBzdHJpbmcsIGRldGFpbD86IGFueSk6IGJvb2xlYW47XG4gICAgd2l0aEV4dGVuc2lvbnMoZWx0OiBFbGVtZW50LCBjYWxsYmFjazogKGV4dGVuc2lvbjogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICBtYWtlU2V0dGxlSW5mbyhlbHQ6IEVsZW1lbnQpOiBhbnk7XG4gICAgbWFrZUZyYWdtZW50KGh0bWw6IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQ7XG4gICAgb29iU3dhcChzd2FwU3R5bGU6IHN0cmluZywgZnJhZ21lbnQ6IEVsZW1lbnQsIHNldHRsZUluZm86IGFueSk6IHZvaWQ7XG4gICAgc2V0dGxlSW1tZWRpYXRlbHkodGFza3M6IGFueSk6IHZvaWQ7XG4gICAgZ2V0Q2xvc2VzdE1hdGNoKGVsdDogRWxlbWVudCwgY29uZGl0aW9uOiAobm9kZTogRWxlbWVudCkgPT4gYm9vbGVhbik6IEVsZW1lbnQgfCBudWxsO1xuICAgIGdldFRyaWdnZXJTcGVjcyhlbHQ6IEVsZW1lbnQpOiBhbnlbXTtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQ6IEVsZW1lbnQsIHRyaWdnZXJTcGVjOiBhbnksIG5vZGVEYXRhOiBhbnksIGhhbmRsZXI6IChlbHQ6IEVsZW1lbnQsIGV2dDogRXZlbnQpID0+IHZvaWQpOiB2b2lkO1xuICAgIGdldEhlYWRlcnMoZWx0OiBFbGVtZW50LCB0YXJnZXQ6IEVsZW1lbnQpOiBhbnk7XG4gICAgZ2V0VGFyZ2V0KGVsdDogRWxlbWVudCk6IEVsZW1lbnQ7XG4gICAgZ2V0SW5wdXRWYWx1ZXMoZWx0OiBFbGVtZW50LCB2ZXJiOiBzdHJpbmcpOiB7IGVycm9yczogYW55W107IHZhbHVlczogYW55IH07XG4gICAgZ2V0RXhwcmVzc2lvblZhcnMoZWx0OiBFbGVtZW50KTogYW55O1xuICAgIG1lcmdlT2JqZWN0cyhvYmoxOiBhbnksIG9iajI6IGFueSk6IGFueTtcbiAgICBmaWx0ZXJWYWx1ZXModmFsdWVzOiBhbnksIGVsdDogRWxlbWVudCk6IGFueTtcbiAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQ/OiBFbGVtZW50LCBuYW1lPzogc3RyaW5nLCBkZXRhaWw/OiBhbnkpOiB2b2lkO1xuICAgIGhhc0F0dHJpYnV0ZShlbHQ6IEVsZW1lbnQsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgc2hvdWxkQ2FuY2VsKGV2dDogRXZlbnQsIGVsdDogRWxlbWVudCk6IGJvb2xlYW47XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5pbnRlcmZhY2UgV2ViU29ja2V0V3JhcHBlciB7XG4gICAgc29ja2V0OiBXZWJTb2NrZXQ7XG4gICAgZXZlbnRzIDogeyBba2V5OiBzdHJpbmddOiAoKGV2ZW50OiBFdmVudCkgPT4gdm9pZClbXSB9O1xuICAgIG1lc3NhZ2VRdWV1ZTogeyBtZXNzYWdlOiBzdHJpbmc7IHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsIH1bXTtcbiAgICByZXRyeUNvdW50OiBudW1iZXI7XG4gICAgc2VuZEltbWVkaWF0ZWx5KG1lc3NhZ2U6IHN0cmluZywgc2VuZEVsdDogRWxlbWVudCB8IG51bGwpOiB2b2lkO1xuICAgIHNlbmQobWVzc2FnZTogc3RyaW5nLCBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCk6IHZvaWQ7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkKTogdm9pZDtcbiAgICBoYW5kbGVRdWV1ZWRNZXNzYWdlcygpOiB2b2lkO1xuICAgIGluaXQoKTogdm9pZDtcbiAgICBjbG9zZSgpOiB2b2lkO1xuICAgIHB1YmxpY0ludGVyZmFjZToge1xuICAgICAgICBzZW5kOiAobWVzc2FnZTogc3RyaW5nLCBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCkgPT4gdm9pZDtcbiAgICAgICAgc2VuZEltbWVkaWF0ZWx5OiAobWVzc2FnZTogc3RyaW5nLCBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCkgPT4gdm9pZDtcbiAgICAgICAgcXVldWU6IHsgbWVzc2FnZTogc3RyaW5nOyBzZW5kRWx0OiBFbGVtZW50IHwgbnVsbCB9W107XG4gICAgfTtcbn1cblxubGV0IGFwaTogSHRteEludGVybmFsQXBpO1xuXG5mdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG59XG5cbmZ1bmN0aW9uIGdldExlZ2FjeVdlYnNvY2tldFVSTChlbHQ6IEVsZW1lbnQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxlZ2FjeVNTRVZhbHVlID0gYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXdzJyk7XG4gICAgaWYgKGxlZ2FjeVNTRVZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHNwbGl0T25XaGl0ZXNwYWNlKGxlZ2FjeVNTRVZhbHVlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldLnNwbGl0KC86KC4rKS8pO1xuICAgICAgICAgICAgaWYgKHZhbHVlWzBdID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZW5zdXJlV2ViU29ja2V0KHNvY2tldEVsdDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAvLyBJZiB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBubyBsb25nZXIgZXhpc3RzLCB0aGVuXG4gICAgLy8gZG8gbm90IGNvbm5lY3QvcmVjb25uZWN0IHRoZSBXZWJTb2NrZXQuXG4gICAgaWYgKCFhcGkuYm9keUNvbnRhaW5zKHNvY2tldEVsdCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgc291cmNlIHN0cmFpZ2h0IGZyb20gdGhlIGVsZW1lbnQncyB2YWx1ZVxuICAgIGxldCB3c3NTb3VyY2UgPSBhcGkuZ2V0QXR0cmlidXRlVmFsdWUoc29ja2V0RWx0LCAnd3MtY29ubmVjdCcpO1xuXG4gICAgaWYgKHdzc1NvdXJjZSA9PSBudWxsIHx8IHdzc1NvdXJjZSA9PT0gJycpIHtcbiAgICAgICAgY29uc3QgbGVnYWN5U291cmNlID0gZ2V0TGVnYWN5V2Vic29ja2V0VVJMKHNvY2tldEVsdCk7XG4gICAgICAgIGlmIChsZWdhY3lTb3VyY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3NzU291cmNlID0gbGVnYWN5U291cmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR3VhcmFudGVlIHRoYXQgdGhlIHdzc1NvdXJjZSB2YWx1ZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBVUkxcbiAgICBpZiAod3NzU291cmNlLmluZGV4T2YoJy8nKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBiYXNlX3BhcnQgPSBsb2NhdGlvbi5ob3N0bmFtZSArIChsb2NhdGlvbi5wb3J0ID8gJzonICsgbG9jYXRpb24ucG9ydCA6ICcnKTtcbiAgICAgICAgaWYgKGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgICAgICAgd3NzU291cmNlID0gJ3dzczovLycgKyBiYXNlX3BhcnQgKyB3c3NTb3VyY2U7XG4gICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwOicpIHtcbiAgICAgICAgICAgIHdzc1NvdXJjZSA9ICd3czovLycgKyBiYXNlX3BhcnQgKyB3c3NTb3VyY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzb2NrZXRXcmFwcGVyID0gY3JlYXRlV2Vic29ja2V0V3JhcHBlcihzb2NrZXRFbHQsICgpID0+IGNyZWF0ZVdlYlNvY2tldCh3c3NTb3VyY2UpKTtcblxuICAgIHNvY2tldFdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAobWF5YmVDbG9zZVdlYlNvY2tldFNvdXJjZShzb2NrZXRFbHQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2UgPSAoZXZlbnQgYXMgTWVzc2FnZUV2ZW50KS5kYXRhO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhYXBpLnRyaWdnZXJFdmVudChzb2NrZXRFbHQsICdodG14OndzQmVmb3JlTWVzc2FnZScsIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXNwb25zZSxcbiAgICAgICAgICAgICAgICBzb2NrZXRXcmFwcGVyOiBzb2NrZXRXcmFwcGVyLnB1YmxpY0ludGVyZmFjZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBpLndpdGhFeHRlbnNpb25zKHNvY2tldEVsdCwgKGV4dGVuc2lvbikgPT4ge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2UocmVzcG9uc2UsIG51bGwsIHNvY2tldEVsdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oc29ja2V0RWx0KTtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBhcGkubWFrZUZyYWdtZW50KHJlc3BvbnNlKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZnJhZ21lbnQuY2hpbGRyZW4pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV1cbiAgICAgICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGRyZW5baV0sIHNldHRsZUluZm8pO1xuICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgICAgICBpZihjaGlsZC50YWdOYW1lID09PSAnU0NSSVBUJyAmJiBjaGlsZC5pZC5zdGFydHNXaXRoKFwiX19ldmFsXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFwaS5zZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKTtcbiAgICAgICAgYXBpLnRyaWdnZXJFdmVudChzb2NrZXRFbHQsICdodG14OndzQWZ0ZXJNZXNzYWdlJywge1xuICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2UsXG4gICAgICAgICAgICBzb2NrZXRXcmFwcGVyOiBzb2NrZXRXcmFwcGVyLnB1YmxpY0ludGVyZmFjZSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBQdXQgdGhlIFdlYlNvY2tldCBpbnRvIHRoZSBIVE1MIEVsZW1lbnQncyBjdXN0b20gZGF0YS5cbiAgICBhcGkuZ2V0SW50ZXJuYWxEYXRhKHNvY2tldEVsdCkud2ViU29ja2V0ID0gc29ja2V0V3JhcHBlcjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlV2Vic29ja2V0V3JhcHBlcihzb2NrZXRFbHQ6IEhUTUxFbGVtZW50LCBzb2NrZXRGdW5jOiAoKSA9PiBXZWJTb2NrZXQpOiBXZWJTb2NrZXRXcmFwcGVyIHtcbiAgICBjb25zdCB3cmFwcGVyOiBXZWJTb2NrZXRXcmFwcGVyID0ge1xuICAgICAgICBzb2NrZXQ6IG51bGwgYXMgdW5rbm93biBhcyBXZWJTb2NrZXQsXG4gICAgICAgIG1lc3NhZ2VRdWV1ZTogW10sXG4gICAgICAgIHJldHJ5Q291bnQ6IDAsXG4gICAgICAgIGV2ZW50czoge30gYXMgeyBba2V5OiBzdHJpbmddOiAoKGV2ZW50OiBFdmVudCkgPT4gdm9pZClbXSB9LFxuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IChldmVudDogRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZXZlbnRzW2V2ZW50XSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzW2V2ZW50XSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmV2ZW50c1tldmVudF0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZEltbWVkaWF0ZWx5KG1lc3NhZ2U6IHN0cmluZywgc2VuZEVsdDogRWxlbWVudCB8IG51bGwpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zb2NrZXQpIHtcbiAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckVycm9yRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c0Vycm9yJywgeyBlcnJvcjogJ05vIHNvY2tldCBhdmFpbGFibGUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFzZW5kRWx0IHx8XG4gICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFdmVudChzZW5kRWx0LCAnaHRteDp3c0JlZm9yZVNlbmQnLCB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHNvY2tldFdyYXBwZXI6IHRoaXMucHVibGljSW50ZXJmYWNlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGlmIChzZW5kRWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoc2VuZEVsdCwgJ2h0bXg6d3NBZnRlclNlbmQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0V3JhcHBlcjogdGhpcy5wdWJsaWNJbnRlcmZhY2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2VuZChtZXNzYWdlOiBzdHJpbmcsIHNlbmRFbHQ6IEVsZW1lbnQgfCBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPT0gdGhpcy5zb2NrZXQuT1BFTikge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnB1c2goeyBtZXNzYWdlLCBzZW5kRWx0IH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRJbW1lZGlhdGVseShtZXNzYWdlLCBzZW5kRWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaGFuZGxlUXVldWVkTWVzc2FnZXMoKSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5tZXNzYWdlUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXVlZEl0ZW0gPSB0aGlzLm1lc3NhZ2VRdWV1ZVswXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuT1BFTikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmRJbW1lZGlhdGVseShxdWV1ZWRJdGVtLm1lc3NhZ2UsIHF1ZXVlZEl0ZW0uc2VuZEVsdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICAgICAgICAvLyBDbG9zZSBkaXNjYXJkZWQgc29ja2V0XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFdlYlNvY2tldCBhbmQgZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgICAgIGNvbnN0IHNvY2tldCA9IHNvY2tldEZ1bmMoKTtcblxuICAgICAgICAgICAgLy8gVGhlIGV2ZW50LnR5cGUgZGV0YWlsIGlzIGFkZGVkIGZvciBpbnRlcmZhY2UgY29uZm9ybWFuY2Ugd2l0aCB0aGVcbiAgICAgICAgICAgIC8vIG90aGVyIHR3byBsaWZlY3ljbGUgZXZlbnRzIChvcGVuIGFuZCBjbG9zZSkgc28gYSBzaW5nbGUgaGFuZGxlciBtZXRob2RcbiAgICAgICAgICAgIC8vIGNhbiBoYW5kbGUgdGhlbSBwb2x5bW9ycGhpY2FsbHksIGlmIHJlcXVpcmVkLlxuICAgICAgICAgICAgYXBpLnRyaWdnZXJFdmVudChzb2NrZXRFbHQsICdodG14OndzQ29ubmVjdGluZycsIHsgZXZlbnQ6IHsgdHlwZTogJ2Nvbm5lY3RpbmcnIH0gfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuXG4gICAgICAgICAgICBzb2NrZXQub25vcGVuID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJldHJ5Q291bnQgPSAwO1xuICAgICAgICAgICAgICAgIGFwaS50cmlnZ2VyRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c09wZW4nLCB7IGV2ZW50OiBlLCBzb2NrZXRXcmFwcGVyOiB0aGlzLnB1YmxpY0ludGVyZmFjZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVF1ZXVlZE1lc3NhZ2VzKCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzb2NrZXQub25jbG9zZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc29ja2V0IHNob3VsZCBub3QgYmUgY29ubmVjdGVkLCBzdG9wIGZ1cnRoZXIgYXR0ZW1wdHMgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBJZiBBYm5vcm1hbCBDbG9zdXJlL1NlcnZpY2UgUmVzdGFydC9UcnkgQWdhaW4gTGF0ZXIsIHRoZW4gc2V0IGEgdGltZXIgdG8gcmVjb25uZWN0IGFmdGVyIGEgcGF1c2UuXG4gICAgICAgICAgICAgICAgaWYgKCFtYXliZUNsb3NlV2ViU29ja2V0U291cmNlKHNvY2tldEVsdCkgJiYgWzEwMDYsIDEwMTIsIDEwMTNdLmluZGV4T2YoZS5jb2RlKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkodGhpcy5yZXRyeUNvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJldHJ5Q291bnQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTm90aWZ5IGNsaWVudCBjb2RlIHRoYXQgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuIENsaWVudCBjb2RlIGNhbiBpbnNwZWN0IGBldmVudGAgZmllbGRcbiAgICAgICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgd2hldGhlciBjbG9zdXJlIGhhcyBiZWVuIHZhbGlkIG9yIGFibm9ybWFsXG4gICAgICAgICAgICAgICAgYXBpLnRyaWdnZXJFdmVudChzb2NrZXRFbHQsICdodG14OndzQ2xvc2UnLCB7IGV2ZW50OiBlLCBzb2NrZXRXcmFwcGVyOiB0aGlzLnB1YmxpY0ludGVyZmFjZSB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHNvY2tldC5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckVycm9yRXZlbnQoc29ja2V0RWx0LCAnaHRteDp3c0Vycm9yJywgeyBlcnJvcjogZSwgc29ja2V0V3JhcHBlcjogdGhpcyB9KTtcbiAgICAgICAgICAgICAgICBtYXliZUNsb3NlV2ViU29ja2V0U291cmNlKHNvY2tldEVsdCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBldmVudHMgPSB0aGlzLmV2ZW50cztcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50c1trXS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKGssIGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlKCkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcHVibGljSW50ZXJmYWNlOiB7fSBhcyBhbnksXG4gICAgfTtcblxuICAgIHdyYXBwZXIuaW5pdCgpO1xuXG4gICAgd3JhcHBlci5wdWJsaWNJbnRlcmZhY2UgPSB7XG4gICAgICAgIHNlbmQ6IHdyYXBwZXIuc2VuZC5iaW5kKHdyYXBwZXIpLFxuICAgICAgICBzZW5kSW1tZWRpYXRlbHk6IHdyYXBwZXIuc2VuZEltbWVkaWF0ZWx5LmJpbmQod3JhcHBlciksXG4gICAgICAgIHF1ZXVlOiB3cmFwcGVyLm1lc3NhZ2VRdWV1ZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVdlYlNvY2tldFNlbmQoZWx0OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGxlZ2FjeUF0dHJpYnV0ZSA9IGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC13cycpO1xuICAgIGlmIChsZWdhY3lBdHRyaWJ1dGUgJiYgbGVnYWN5QXR0cmlidXRlICE9PSAnc2VuZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYlNvY2tldFBhcmVudCA9IGFwaS5nZXRDbG9zZXN0TWF0Y2goZWx0LCAobm9kZSkgPT4ge1xuICAgICAgICByZXR1cm4gaGFzV2ViU29ja2V0KG5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgIH0pO1xuICAgIGlmICh3ZWJTb2NrZXRQYXJlbnQpIHtcbiAgICAgICAgcHJvY2Vzc1dlYlNvY2tldFNlbmQod2ViU29ja2V0UGFyZW50IGFzIEhUTUxFbGVtZW50LCBlbHQpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFzV2ViU29ja2V0KG5vZGU6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFwaS5nZXRJbnRlcm5hbERhdGEobm9kZSkud2ViU29ja2V0ICE9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NXZWJTb2NrZXRTZW5kKHNvY2tldEVsdDogSFRNTEVsZW1lbnQsIHNlbmRFbHQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBhcGkuZ2V0SW50ZXJuYWxEYXRhKHNlbmRFbHQpO1xuICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGFwaS5nZXRUcmlnZ2VyU3BlY3Moc2VuZEVsdCk7XG4gICAgdHJpZ2dlclNwZWNzLmZvckVhY2goKHRzKSA9PiB7XG4gICAgICAgIGFwaS5hZGRUcmlnZ2VySGFuZGxlcihzZW5kRWx0LCB0cywgbm9kZURhdGEsIChlbHQ6IEVsZW1lbnQsIGV2dDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChtYXliZUNsb3NlV2ViU29ja2V0U291cmNlKHNvY2tldEVsdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvY2tldFdyYXBwZXI6IFdlYlNvY2tldFdyYXBwZXIgPSBhcGkuZ2V0SW50ZXJuYWxEYXRhKHNvY2tldEVsdCkud2ViU29ja2V0O1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IGFwaS5nZXRIZWFkZXJzKHNlbmRFbHQsIGFwaS5nZXRUYXJnZXQoc2VuZEVsdCkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGFwaS5nZXRJbnB1dFZhbHVlcyhzZW5kRWx0LCAncG9zdCcpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnM7XG4gICAgICAgICAgICBjb25zdCByYXdQYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgcmVzdWx0cy52YWx1ZXMpO1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvblZhcnMgPSBhcGkuZ2V0RXhwcmVzc2lvblZhcnMoc2VuZEVsdCk7XG4gICAgICAgICAgICBjb25zdCBhbGxQYXJhbWV0ZXJzID0gYXBpLm1lcmdlT2JqZWN0cyhyYXdQYXJhbWV0ZXJzLCBleHByZXNzaW9uVmFycyk7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZFBhcmFtZXRlcnMgPSBhcGkuZmlsdGVyVmFsdWVzKGFsbFBhcmFtZXRlcnMsIHNlbmRFbHQpO1xuXG4gICAgICAgICAgICBjb25zdCBzZW5kQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IGZpbHRlcmVkUGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB1bmZpbHRlcmVkUGFyYW1ldGVyczogYWxsUGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIGVycm9ycyxcblxuICAgICAgICAgICAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZ0LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VCb2R5OiB1bmRlZmluZWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHNvY2tldFdyYXBwZXI6IHNvY2tldFdyYXBwZXIucHVibGljSW50ZXJmYWNlLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKCFhcGkudHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6d3NDb25maWdTZW5kJywgc2VuZENvbmZpZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBhcGkudHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGlvbjpoYWx0ZWQnLCBlcnJvcnMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGJvZHkgPSBzZW5kQ29uZmlnLm1lc3NhZ2VCb2R5O1xuICAgICAgICAgICAgaWYgKGJvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvU2VuZCA9IE9iamVjdC5hc3NpZ24oe30sIHNlbmRDb25maWcucGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbmRDb25maWcuaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICB0b1NlbmQuSEVBREVSUyA9IGhlYWRlcnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeSh0b1NlbmQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzb2NrZXRXcmFwcGVyLnNlbmQoYm9keSwgZWx0IGFzIEVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoZXZ0ICYmIGFwaS5zaG91bGRDYW5jZWwoZXZ0LCBlbHQgYXMgRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KHJldHJ5Q291bnQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgZXhwID0gTWF0aC5taW4ocmV0cnlDb3VudCwgNik7XG4gICAgY29uc3QgbWF4RGVsYXkgPSAxMDAwICogTWF0aC5wb3coMiwgZXhwKTtcbiAgICByZXR1cm4gbWF4RGVsYXkgKiBNYXRoLnJhbmRvbSgpO1xufVxuXG5mdW5jdGlvbiBtYXliZUNsb3NlV2ViU29ja2V0U291cmNlKGVsdDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIWFwaS5ib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICBhcGkuZ2V0SW50ZXJuYWxEYXRhKGVsdCkud2ViU29ja2V0LmNsb3NlKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldCh1cmw6IHN0cmluZyk6IFdlYlNvY2tldCB7XG4gICAgY29uc3Qgc29jayA9IG5ldyBXZWJTb2NrZXQodXJsLCBbXSk7XG4gICAgc29jay5iaW5hcnlUeXBlID0gKGh0bXguY29uZmlnLndzQmluYXJ5VHlwZSB8fCAnYmxvYicpIGFzIHVua25vd24gYXMgQmluYXJ5VHlwZTtcbiAgICByZXR1cm4gc29jaztcbn1cblxuZnVuY3Rpb24gcXVlcnlBdHRyaWJ1dGVPblRoaXNPckNoaWxkcmVuKGVsdDogSFRNTEVsZW1lbnQsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50W10ge1xuICAgIGNvbnN0IHJlc3VsdDogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgLy8gSWYgdGhlIHBhcmVudCBlbGVtZW50IGFsc28gY29udGFpbnMgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUsIHRoZW4gYWRkIGl0IHRvIHRoZSByZXN1bHRzIHRvby5cbiAgICBpZiAoYXBpLmhhc0F0dHJpYnV0ZShlbHQsIGF0dHJpYnV0ZU5hbWUpIHx8IGFwaS5oYXNBdHRyaWJ1dGUoZWx0LCAnaHgtd3MnKSkge1xuICAgICAgICByZXN1bHQucHVzaChlbHQpO1xuICAgIH1cblxuICAgIC8vIFNlYXJjaCBhbGwgY2hpbGQgbm9kZXMgdGhhdCBtYXRjaCB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZVxuICAgIGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIGF0dHJpYnV0ZU5hbWUgKyAnXSwgW2RhdGEtJyArIGF0dHJpYnV0ZU5hbWUgKyAnXSwgW2RhdGEtaHgtd3NdLCBbaHgtd3NdJykuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICByZXN1bHQucHVzaChub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2g8VD4oYXJyOiBUW10sIGZ1bmM6IChpdGVtOiBUKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKGFycikge1xuICAgICAgICBhcnIuZm9yRWFjaChmdW5jKTtcbiAgICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKCd3cycsIHtcbiAgICBpbml0OiAoYXBpUmVmOiBIdG14SW50ZXJuYWxBcGkpID0+IHtcbiAgICAgICAgLy8gU3RvcmUgcmVmZXJlbmNlIHRvIGludGVybmFsIEFQSVxuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiAobmFtZTogc3RyaW5nLCBldnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmVudDogRWxlbWVudCA9IGV2dC50YXJnZXQgYXMgRWxlbWVudCB8fCAoZXZ0IGFzIEN1c3RvbUV2ZW50KS5kZXRhaWwuZWx0O1xuXG4gICAgICAgIGlmKCEocGFyZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIGNsb3NlIHRoZSBzb2NrZXQgd2hlbiBlbGVtZW50cyBhcmUgcmVtb3ZlZFxuICAgICAgICAgICAgY2FzZSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCc6XG4gICAgICAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMocGFyZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBhcGkuZ2V0SW50ZXJuYWxEYXRhKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGludGVybmFsRGF0YS53ZWJTb2NrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxEYXRhLndlYlNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIFRyeSB0byBjcmVhdGUgd2Vic29ja2V0cyB3aGVuIGVsZW1lbnRzIGFyZSBwcm9jZXNzZWRcbiAgICAgICAgICAgIGNhc2UgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnOlxuICAgICAgICAgICAgICAgIGlmKHBhcmVudC5oYXNBdHRyaWJ1dGUoXCJ3cy1jb25uZWN0XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuc3VyZVdlYlNvY2tldChwYXJlbnQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKHBhcmVudC5oYXNBdHRyaWJ1dGUoXCJ3cy1zZW5kXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuc3VyZVdlYlNvY2tldFNlbmQocGFyZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy93c1wiXG5cbmZ1bmN0aW9uIHdhdGNoVXJsKGNhbGxiYWNrOiAob2xkVXJsOiBzdHJpbmcsIG5ld1VybDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGxldCBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHNldEludGVydmFsKCgpID0+IHtcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYgIT09IGxhc3RVcmwpIHtcbiAgICAgIGNhbGxiYWNrKGxhc3RVcmwsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgIGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG4gIH0sIDEwMCk7XG59XG5cbndhdGNoVXJsKChfLCBuZXdVcmwpID0+IHtcbiAgb25VcmxDaGFuZ2UobmV3VXJsKTtcbn0pO1xuXG5mdW5jdGlvbiBvblVybENoYW5nZShuZXdVcmw6IHN0cmluZykge1xuICBsZXQgdXJsID0gbmV3IFVSTChuZXdVcmwpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcl1cIikuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC10cmlnZ2VyXCIpO1xuICAgIGlmICghdHJpZ2dlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3BsaXQgPSB0cmlnZ2Vycy5zcGxpdChcIiwgXCIpO1xuICAgIGlmIChzcGxpdC5maW5kKChzKSA9PiBzID09PSBcInVybFwiKSkge1xuICAgICAgaHRteC5zd2FwKGVsZW1lbnQsIFwidXJsXCIsIHtcbiAgICAgICAgc3dhcFN0eWxlOiBcIm91dGVySFRNTFwiLFxuICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlc10gb2YgdXJsLnNlYXJjaFBhcmFtcykge1xuICAgICAgICBsZXQgZXZlbnROYW1lID0gXCJxczpcIiArIGtleTtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmluY2x1ZGVzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRyaWdnZXJpbmdcIiwgZXZlbnROYW1lKTtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgZXZlbnROYW1lLCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC1tYXRjaC1xcF1cIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBsZXQgaGFzTWF0Y2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGVsLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBuYW1lLnJlcGxhY2UoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiLCBcIlwiKTtcbiAgICAgICAgbGV0IHZhbHVlID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQobWF0Y2gpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBodG14LnN3YXAoZWwsIGVsLmdldEF0dHJpYnV0ZShuYW1lKSA/PyBcIlwiLCB7XG4gICAgICAgICAgICBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsXG4gICAgICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNNYXRjaCkge1xuICAgICAgbGV0IGRlZmF1bHRLZXkgPSBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1kZWZhdWx0XCIpO1xuICAgICAgaWYgKGRlZmF1bHRLZXkpIHtcbiAgICAgICAgaHRteC5zd2FwKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIgKyBkZWZhdWx0S2V5KSA/PyBcIlwiLFxuICAgICAgICAgIHsgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLCBzd2FwRGVsYXk6IDAsIHNldHRsZURlbGF5OiAwIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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YSxDQUFFLENBQ3pELEVBRUosQ0FDRixDQUFDLEVBQ0giLCJmaWxlIjoiaHRtZ28uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaHRteCA9IChmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnXG5cbiAgLy8gUHVibGljIEFQSVxuICBjb25zdCBodG14ID0ge1xuICAgIC8vIFRzYyBtYWRuZXNzIGhlcmUsIGFzc2lnbmluZyB0aGUgZnVuY3Rpb25zIGRpcmVjdGx5IHJlc3VsdHMgaW4gYW4gaW52YWxpZCBUeXBlU2NyaXB0IG91dHB1dCwgYnV0IHJlYXNzaWduaW5nIGlzIGZpbmVcbiAgICAvKiBFdmVudCBwcm9jZXNzaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygb25Mb2FkSGVscGVyfSAqL1xuICAgIG9uTG9hZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwcm9jZXNzTm9kZX0gKi9cbiAgICBwcm9jZXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZEV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9mZjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0cmlnZ2VyRXZlbnR9ICovXG4gICAgdHJpZ2dlcjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhamF4SGVscGVyfSAqL1xuICAgIGFqYXg6IG51bGwsXG4gICAgLyogRE9NIHF1ZXJ5aW5nIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kfSAqL1xuICAgIGZpbmQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZEFsbH0gKi9cbiAgICBmaW5kQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGNsb3Nlc3R9ICovXG4gICAgY2xvc2VzdDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbnB1dCB2YWx1ZXMgdGhhdCB3b3VsZCByZXNvbHZlIGZvciBhIGdpdmVuIGVsZW1lbnQgdmlhIHRoZSBodG14IHZhbHVlIHJlc29sdXRpb24gbWVjaGFuaXNtXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN2YWx1ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0IHRoZSBlbGVtZW50IHRvIHJlc29sdmUgdmFsdWVzIG9uXG4gICAgICogQHBhcmFtIHtIdHRwVmVyYn0gdHlwZSB0aGUgcmVxdWVzdCB0eXBlIChlLmcuICoqZ2V0Kiogb3IgKipwb3N0KiopIG5vbi1HRVQncyB3aWxsIGluY2x1ZGUgdGhlIGVuY2xvc2luZyBmb3JtIG9mIHRoZSBlbGVtZW50LiBEZWZhdWx0cyB0byAqKnBvc3QqKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgdmFsdWVzOiBmdW5jdGlvbihlbHQsIHR5cGUpIHtcbiAgICAgIGNvbnN0IGlucHV0VmFsdWVzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB0eXBlIHx8ICdwb3N0JylcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlcy52YWx1ZXNcbiAgICB9LFxuICAgIC8qIERPTSBtYW5pcHVsYXRpb24gaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZENsYXNzVG9FbGVtZW50fSAqL1xuICAgIGFkZENsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdG9nZ2xlQ2xhc3NPbkVsZW1lbnR9ICovXG4gICAgdG9nZ2xlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdGFrZUNsYXNzRm9yRWxlbWVudH0gKi9cbiAgICB0YWtlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygc3dhcH0gKi9cbiAgICBzd2FwOiBudWxsLFxuICAgIC8qIEV4dGVuc2lvbiBlbnRyeXBvaW50cyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGRlZmluZUV4dGVuc2lvbn0gKi9cbiAgICBkZWZpbmVFeHRlbnNpb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXh0ZW5zaW9ufSAqL1xuICAgIHJlbW92ZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dBbGx9ICovXG4gICAgbG9nQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ05vbmV9ICovXG4gICAgbG9nTm9uZTogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKipcbiAgICAgKiBUaGUgbG9nZ2VyIGh0bXggdXNlcyB0byBsb2cgd2l0aFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nZ2VyXG4gICAgICovXG4gICAgbG9nZ2VyOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHkgaG9sZGluZyB0aGUgY29uZmlndXJhdGlvbiBodG14IHVzZXMgYXQgcnVudGltZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB1c2luZyBhIFttZXRhIHRhZ10oaHR0cHM6Ly9odG14Lm9yZy9kb2NzLyNjb25maWcpIGlzIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHRoZXNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjb25maWdcbiAgICAgKi9cbiAgICBjb25maWc6IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byB1c2UgaGlzdG9yeS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUVuYWJsZWQ6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8ga2VlcCBpbiAqKmxvY2FsU3RvcmFnZSoqIGZvciBoaXN0b3J5IHN1cHBvcnQuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlDYWNoZVNpemU6IDEwLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICByZWZyZXNoT25IaXN0b3J5TWlzczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IHN3YXAgc3R5bGUgdG8gdXNlIGlmICoqW2h4LXN3YXBdKGh0dHBzOi8vaHRteC5vcmcvYXR0cmlidXRlcy9oeC1zd2FwKSoqIGlzIG9taXR0ZWQuXG4gICAgICAgKiBAdHlwZSBIdG14U3dhcFN0eWxlXG4gICAgICAgKiBAZGVmYXVsdCAnaW5uZXJIVE1MJ1xuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcFN0eWxlOiAnaW5uZXJIVE1MJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiByZWNlaXZpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGRvaW5nIHRoZSBzd2FwLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwRGVsYXk6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gY29tcGxldGluZyB0aGUgY29udGVudCBzd2FwIGFuZCBzZXR0bGluZyBhdHRyaWJ1dGVzLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U2V0dGxlRGVsYXk6IDIwLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0cnVlLCBodG14IHdpbGwgaW5qZWN0IGEgc21hbGwgYW1vdW50IG9mIENTUyBpbnRvIHRoZSBwYWdlIHRvIG1ha2UgaW5kaWNhdG9ycyBpbnZpc2libGUgdW5sZXNzIHRoZSAqKmh0bXgtaW5kaWNhdG9yKiogY2xhc3MgaXMgcHJlc2VudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaW5jbHVkZUluZGljYXRvclN0eWxlczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIGluZGljYXRvcnMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1pbmRpY2F0b3InXG4gICAgICAgKi9cbiAgICAgIGluZGljYXRvckNsYXNzOiAnaHRteC1pbmRpY2F0b3InLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdHJpZ2dlcmluZyBlbGVtZW50cyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXJlcXVlc3QnXG4gICAgICAgKi9cbiAgICAgIHJlcXVlc3RDbGFzczogJ2h0bXgtcmVxdWVzdCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byB0ZW1wb3JhcmlseSBwbGFjZSBvbiBlbGVtZW50cyB0aGF0IGh0bXggaGFzIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWFkZGVkJ1xuICAgICAgICovXG4gICAgICBhZGRlZENsYXNzOiAnaHRteC1hZGRlZCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc2V0dGxpbmcnXG4gICAgICAgKi9cbiAgICAgIHNldHRsaW5nQ2xhc3M6ICdodG14LXNldHRsaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHN3YXBwaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zd2FwcGluZydcbiAgICAgICAqL1xuICAgICAgc3dhcHBpbmdDbGFzczogJ2h0bXgtc3dhcHBpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvd3MgdGhlIHVzZSBvZiBldmFsLWxpa2UgZnVuY3Rpb25hbGl0eSBpbiBodG14LCB0byBlbmFibGUgKipoeC12YXJzKiosIHRyaWdnZXIgY29uZGl0aW9ucyAmIHNjcmlwdCB0YWcgZXZhbHVhdGlvbi4gQ2FuIGJlIHNldCB0byAqKmZhbHNlKiogZm9yIENTUCBjb21wYXRpYmlsaXR5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd0V2YWw6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byBmYWxzZSwgZGlzYWJsZXMgdGhlIGludGVycHJldGF0aW9uIG9mIHNjcmlwdCB0YWdzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd1NjcmlwdFRhZ3M6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHNjcmlwdHMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVNjcmlwdE5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc3R5bGVzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTdHlsZU5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGF0dHJpYnV0ZXMgdG8gc2V0dGxlIGR1cmluZyB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgICAgICogQGRlZmF1bHQgWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXVxuICAgICAgICovXG4gICAgICBhdHRyaWJ1dGVzVG9TZXR0bGU6IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93IGNyb3NzLXNpdGUgQWNjZXNzLUNvbnRyb2wgcmVxdWVzdHMgdXNpbmcgY3JlZGVudGlhbHMgc3VjaCBhcyBjb29raWVzLCBhdXRob3JpemF0aW9uIGhlYWRlcnMgb3IgVExTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgdGltZW91dDogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgKipnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheSoqIGZvciByZWNvbm5lY3RpbmcgYWZ0ZXIgdW5leHBlY3RlZCBjb25uZWN0aW9uIGxvc3MgYnkgdGhlIGV2ZW50IGNvZGUgKipBYm5vcm1hbCBDbG9zdXJlKiosICoqU2VydmljZSBSZXN0YXJ0Kiogb3IgKipUcnkgQWdhaW4gTGF0ZXIqKi5cbiAgICAgICAqIEB0eXBlIHsnZnVsbC1qaXR0ZXInIHwgKChyZXRyeUNvdW50Om51bWJlcikgPT4gbnVtYmVyKX1cbiAgICAgICAqIEBkZWZhdWx0IFwiZnVsbC1qaXR0ZXJcIlxuICAgICAgICovXG4gICAgICB3c1JlY29ubmVjdERlbGF5OiAnZnVsbC1qaXR0ZXInLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdHlwZSBvZiBiaW5hcnkgZGF0YSBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICogQHR5cGUgQmluYXJ5VHlwZVxuICAgICAgICogQGRlZmF1bHQgJ2Jsb2InXG4gICAgICAgKi9cbiAgICAgIHdzQmluYXJ5VHlwZTogJ2Jsb2InLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJ1xuICAgICAgICovXG4gICAgICBkaXNhYmxlU2VsZWN0b3I6ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgeydhdXRvJyB8ICdpbnN0YW50JyB8ICdzbW9vdGgnfVxuICAgICAgICogQGRlZmF1bHQgJ2luc3RhbnQnXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoZSBmb2N1c2VkIGVsZW1lbnQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdmlldy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRGb2N1c1Njcm9sbDogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBpbmNsdWRlIGEgY2FjaGUtYnVzdGluZyBwYXJhbWV0ZXIgaW4gR0VUIHJlcXVlc3RzIHRvIGF2b2lkIGNhY2hpbmcgcGFydGlhbCByZXNwb25zZXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdldENhY2hlQnVzdGVyUGFyYW06IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgaHRteCB3aWxsIHVzZSB0aGUgVmlldyBUcmFuc2l0aW9uIEFQSSB3aGVuIHN3YXBwaW5nIGluIG5ldyBjb250ZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2xvYmFsVmlld1RyYW5zaXRpb25zOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogaHRteCB3aWxsIGZvcm1hdCByZXF1ZXN0cyB3aXRoIHRoZXNlIG1ldGhvZHMgYnkgZW5jb2RpbmcgdGhlaXIgcGFyYW1ldGVycyBpbiB0aGUgVVJMLCBub3QgdGhlIHJlcXVlc3QgYm9keVxuICAgICAgICogQHR5cGUgeyhIdHRwVmVyYilbXX1cbiAgICAgICAqIEBkZWZhdWx0IFsnZ2V0JywgJ2RlbGV0ZSddXG4gICAgICAgKi9cbiAgICAgIG1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zOiBbJ2dldCcsICdkZWxldGUnXSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGRpc2FibGVzIGh0bXgtYmFzZWQgcmVxdWVzdHMgdG8gbm9uLW9yaWdpbiBob3N0cy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHNlbGZSZXF1ZXN0c09ubHk6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBub3QgdXBkYXRlIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQgd2hlbiBhIHRpdGxlIHRhZyBpcyBmb3VuZCBpbiBuZXcgY29udGVudFxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgaWdub3JlVGl0bGU6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgb2YgYSBib29zdGVkIGVsZW1lbnQgaXMgc2Nyb2xsZWQgaW50byB0aGUgdmlld3BvcnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEludG9WaWV3T25Cb29zdDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNhY2hlIHRvIHN0b3JlIGV2YWx1YXRlZCB0cmlnZ2VyIHNwZWNpZmljYXRpb25zIGludG8uXG4gICAgICAgKiBZb3UgbWF5IGRlZmluZSBhIHNpbXBsZSBvYmplY3QgdG8gdXNlIGEgbmV2ZXItY2xlYXJpbmcgY2FjaGUsIG9yIGltcGxlbWVudCB5b3VyIG93biBzeXN0ZW0gdXNpbmcgYSBbcHJveHkgb2JqZWN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSlcbiAgICAgICAqIEB0eXBlIHtPYmplY3R8bnVsbH1cbiAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAqL1xuICAgICAgdHJpZ2dlclNwZWNzQ2FjaGU6IG51bGwsXG4gICAgICAvKiogQHR5cGUgYm9vbGVhbiAqL1xuICAgICAgZGlzYWJsZUluaGVyaXRhbmNlOiBmYWxzZSxcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1tdICovXG4gICAgICByZXNwb25zZUhhbmRsaW5nOiBbXG4gICAgICAgIHsgY29kZTogJzIwNCcsIHN3YXA6IGZhbHNlIH0sXG4gICAgICAgIHsgY29kZTogJ1syM10uLicsIHN3YXA6IHRydWUgfSxcbiAgICAgICAgeyBjb2RlOiAnWzQ1XS4uJywgc3dhcDogZmFsc2UsIGVycm9yOiB0cnVlIH1cbiAgICAgIF0sXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gcHJvY2VzcyBPT0Igc3dhcHMgb24gZWxlbWVudHMgdGhhdCBhcmUgbmVzdGVkIHdpdGhpbiB0aGUgbWFpbiByZXNwb25zZSBlbGVtZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd05lc3RlZE9vYlN3YXBzOiB0cnVlXG4gICAgfSxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwYXJzZUludGVydmFsfSAqL1xuICAgIHBhcnNlSW50ZXJ2YWw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgaW50ZXJuYWxFdmFsfSAqL1xuICAgIF86IG51bGwsXG4gICAgdmVyc2lvbjogJzIuMC4yJ1xuICB9XG4gIC8vIFRzYyBtYWRuZXNzIHBhcnQgMlxuICBodG14Lm9uTG9hZCA9IG9uTG9hZEhlbHBlclxuICBodG14LnByb2Nlc3MgPSBwcm9jZXNzTm9kZVxuICBodG14Lm9uID0gYWRkRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC5vZmYgPSByZW1vdmVFdmVudExpc3RlbmVySW1wbFxuICBodG14LnRyaWdnZXIgPSB0cmlnZ2VyRXZlbnRcbiAgaHRteC5hamF4ID0gYWpheEhlbHBlclxuICBodG14LmZpbmQgPSBmaW5kXG4gIGh0bXguZmluZEFsbCA9IGZpbmRBbGxcbiAgaHRteC5jbG9zZXN0ID0gY2xvc2VzdFxuICBodG14LnJlbW92ZSA9IHJlbW92ZUVsZW1lbnRcbiAgaHRteC5hZGRDbGFzcyA9IGFkZENsYXNzVG9FbGVtZW50XG4gIGh0bXgucmVtb3ZlQ2xhc3MgPSByZW1vdmVDbGFzc0Zyb21FbGVtZW50XG4gIGh0bXgudG9nZ2xlQ2xhc3MgPSB0b2dnbGVDbGFzc09uRWxlbWVudFxuICBodG14LnRha2VDbGFzcyA9IHRha2VDbGFzc0ZvckVsZW1lbnRcbiAgaHRteC5zd2FwID0gc3dhcFxuICBodG14LmRlZmluZUV4dGVuc2lvbiA9IGRlZmluZUV4dGVuc2lvblxuICBodG14LnJlbW92ZUV4dGVuc2lvbiA9IHJlbW92ZUV4dGVuc2lvblxuICBodG14LmxvZ0FsbCA9IGxvZ0FsbFxuICBodG14LmxvZ05vbmUgPSBsb2dOb25lXG4gIGh0bXgucGFyc2VJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWxcbiAgaHRteC5fID0gaW50ZXJuYWxFdmFsXG5cbiAgY29uc3QgaW50ZXJuYWxBUEkgPSB7XG4gICAgYWRkVHJpZ2dlckhhbmRsZXIsXG4gICAgYm9keUNvbnRhaW5zLFxuICAgIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSxcbiAgICBmaW5kVGhpc0VsZW1lbnQsXG4gICAgZmlsdGVyVmFsdWVzLFxuICAgIHN3YXAsXG4gICAgaGFzQXR0cmlidXRlLFxuICAgIGdldEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0TWF0Y2gsXG4gICAgZ2V0RXhwcmVzc2lvblZhcnMsXG4gICAgZ2V0SGVhZGVycyxcbiAgICBnZXRJbnB1dFZhbHVlcyxcbiAgICBnZXRJbnRlcm5hbERhdGEsXG4gICAgZ2V0U3dhcFNwZWNpZmljYXRpb24sXG4gICAgZ2V0VHJpZ2dlclNwZWNzLFxuICAgIGdldFRhcmdldCxcbiAgICBtYWtlRnJhZ21lbnQsXG4gICAgbWVyZ2VPYmplY3RzLFxuICAgIG1ha2VTZXR0bGVJbmZvLFxuICAgIG9vYlN3YXAsXG4gICAgcXVlcnlTZWxlY3RvckV4dCxcbiAgICBzZXR0bGVJbW1lZGlhdGVseSxcbiAgICBzaG91bGRDYW5jZWwsXG4gICAgdHJpZ2dlckV2ZW50LFxuICAgIHRyaWdnZXJFcnJvckV2ZW50LFxuICAgIHdpdGhFeHRlbnNpb25zXG4gIH1cblxuICBjb25zdCBWRVJCUyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCddXG4gIGNvbnN0IFZFUkJfU0VMRUNUT1IgPSBWRVJCUy5tYXAoZnVuY3Rpb24odmVyYikge1xuICAgIHJldHVybiAnW2h4LScgKyB2ZXJiICsgJ10sIFtkYXRhLWh4LScgKyB2ZXJiICsgJ10nXG4gIH0pLmpvaW4oJywgJylcblxuICBjb25zdCBIRUFEX1RBR19SRUdFWCA9IG1ha2VUYWdSZWdFeCgnaGVhZCcpXG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXRpbGl0aWVzXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge1JlZ0V4cH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VUYWdSZWdFeCh0YWcsIGdsb2JhbCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYDwke3RhZ30oXFxcXHNbXj5dKj58PikoW1xcXFxzXFxcXFNdKj8pPFxcXFwvJHt0YWd9PmAsXG4gICAgICBnbG9iYWwgPyAnZ2ltJyA6ICdpbScpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIGludGVydmFsIHN0cmluZyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBodG14IGRvZXMuIFVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IGhhdmUgdGltaW5nLXJlbGF0ZWQgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQ2F1dGlvbjogQWNjZXB0cyBhbiBpbnQgZm9sbG93ZWQgYnkgZWl0aGVyICoqcyoqIG9yICoqbXMqKi4gQWxsIG90aGVyIHZhbHVlcyB1c2UgKipwYXJzZUZsb2F0KipcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcGFyc2VJbnRlcnZhbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRpbWluZyBzdHJpbmdcbiAgICogQHJldHVybnMge251bWJlcnx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUludGVydmFsKHN0cikge1xuICAgIGlmIChzdHIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgbGV0IGludGVydmFsID0gTmFOXG4gICAgaWYgKHN0ci5zbGljZSgtMikgPT0gJ21zJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMikpXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdzJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMFxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAnbScpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDAgKiA2MFxuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNOYU4oaW50ZXJ2YWwpID8gdW5kZWZpbmVkIDogaW50ZXJ2YWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmF3QXR0cmlidXRlKGVsdCwgbmFtZSkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGVsdC5nZXRBdHRyaWJ1dGUobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIC8vIHJlc29sdmUgd2l0aCBib3RoIGh4IGFuZCBkYXRhLWh4IHByZWZpeGVzXG4gIGZ1bmN0aW9uIGhhc0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gISFlbHQuaGFzQXR0cmlidXRlICYmIChlbHQuaGFzQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpIHx8XG4gICAgICBlbHQuaGFzQXR0cmlidXRlKCdkYXRhLScgKyBxdWFsaWZpZWROYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuIGdldFJhd0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHx8IGdldFJhd0F0dHJpYnV0ZShlbHQsICdkYXRhLScgKyBxdWFsaWZpZWROYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudEVsdChlbHQpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIGlmICghcGFyZW50ICYmIGVsdC5wYXJlbnROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkgcmV0dXJuIGVsdC5wYXJlbnROb2RlXG4gICAgcmV0dXJuIHBhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICAgIHJldHVybiBkb2N1bWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtOb2RlfERvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Um9vdE5vZGUoZWx0LCBnbG9iYWwpIHtcbiAgICByZXR1cm4gZWx0LmdldFJvb3ROb2RlID8gZWx0LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IGdsb2JhbCB9KSA6IGdldERvY3VtZW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0geyhlOk5vZGUpID0+IGJvb2xlYW59IGNvbmRpdGlvblxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0TWF0Y2goZWx0LCBjb25kaXRpb24pIHtcbiAgICB3aGlsZSAoZWx0ICYmICFjb25kaXRpb24oZWx0KSkge1xuICAgICAgZWx0ID0gcGFyZW50RWx0KGVsdClcbiAgICB9XG5cbiAgICByZXR1cm4gZWx0IHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGluaXRpYWxFbGVtZW50XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gYW5jZXN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoaW5pdGlhbEVsZW1lbnQsIGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBkaXNpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1kaXNpbmhlcml0JylcbiAgICB2YXIgaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtaW5oZXJpdCcpXG4gICAgaWYgKGluaXRpYWxFbGVtZW50ICE9PSBhbmNlc3Rvcikge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmRpc2FibGVJbmhlcml0YW5jZSkge1xuICAgICAgICBpZiAoaW5oZXJpdCAmJiAoaW5oZXJpdCA9PT0gJyonIHx8IGluaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpc2luaGVyaXQgJiYgKGRpc2luaGVyaXQgPT09ICcqJyB8fCBkaXNpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICByZXR1cm4gJ3Vuc2V0J1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBsZXQgY2xvc2VzdEF0dHIgPSBudWxsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuICEhKGNsb3Nlc3RBdHRyID0gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoZWx0LCBhc0VsZW1lbnQoZSksIGF0dHJpYnV0ZU5hbWUpKVxuICAgIH0pXG4gICAgaWYgKGNsb3Nlc3RBdHRyICE9PSAndW5zZXQnKSB7XG4gICAgICByZXR1cm4gY2xvc2VzdEF0dHJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMgZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRWYXJpYWJsZVxuICAgIGNvbnN0IG1hdGNoZXNGdW5jdGlvbiA9IGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgKGVsdC5tYXRjaGVzIHx8IGVsdC5tYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWx0LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbHQub01hdGNoZXNTZWxlY3RvcilcbiAgICByZXR1cm4gISFtYXRjaGVzRnVuY3Rpb24gJiYgbWF0Y2hlc0Z1bmN0aW9uLmNhbGwoZWx0LCBzZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdGFydFRhZyhzdHIpIHtcbiAgICBjb25zdCB0YWdNYXRjaGVyID0gLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pXG4gICAgY29uc3QgbWF0Y2ggPSB0YWdNYXRjaGVyLmV4ZWMoc3RyKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSFRNTChyZXNwKSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpXG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcCwgJ3RleHQvaHRtbCcpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBlbHQpIHtcbiAgICB3aGlsZSAoZWx0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsdC5jaGlsZE5vZGVzWzBdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge0hUTUxTY3JpcHRFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZHVwbGljYXRlU2NyaXB0KHNjcmlwdCkge1xuICAgIGNvbnN0IG5ld1NjcmlwdCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICBmb3JFYWNoKHNjcmlwdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBuZXdTY3JpcHQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICB9KVxuICAgIG5ld1NjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdC50ZXh0Q29udGVudFxuICAgIG5ld1NjcmlwdC5hc3luYyA9IGZhbHNlXG4gICAgaWYgKGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlKSB7XG4gICAgICBuZXdTY3JpcHQubm9uY2UgPSBodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZVxuICAgIH1cbiAgICByZXR1cm4gbmV3U2NyaXB0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpIHtcbiAgICByZXR1cm4gc2NyaXB0Lm1hdGNoZXMoJ3NjcmlwdCcpICYmIChzY3JpcHQudHlwZSA9PT0gJ3RleHQvamF2YXNjcmlwdCcgfHwgc2NyaXB0LnR5cGUgPT09ICdtb2R1bGUnIHx8IHNjcmlwdC50eXBlID09PSAnJylcbiAgfVxuXG4gIC8qKlxuICAgKiB3ZSBoYXZlIHRvIG1ha2UgbmV3IGNvcGllcyBvZiBzY3JpcHQgdGFncyB0aGF0IHdlIGFyZSBnb2luZyB0byBpbnNlcnQgYmVjYXVzZVxuICAgKiBTT01FIGJyb3dzZXJzIChub3Qgc2F5aW5nIHdobywgYnV0IGl0IGludm9sdmVzIGFuIGVsZW1lbnQgYW5kIGFuIGFuaW1hbCkgZG9uJ3RcbiAgICogZXhlY3V0ZSBzY3JpcHRzIGNyZWF0ZWQgaW4gPHRlbXBsYXRlPiB0YWdzIHdoZW4gdGhleSBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXG4gICAqIGFuZCBhbGwgdGhlIG90aGVycyBkbyBsbWFvXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpIHtcbiAgICBBcnJheS5mcm9tKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpKS5mb3JFYWNoKC8qKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHQgKi8gKHNjcmlwdCkgPT4ge1xuICAgICAgaWYgKGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSkge1xuICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBzY3JpcHQucGFyZW50Tm9kZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3U2NyaXB0LCBzY3JpcHQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7RG9jdW1lbnRGcmFnbWVudCAmIHt0aXRsZT86IHN0cmluZ319IERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGVcbiAgICogQGRlc2NyaXB0aW9uICBhIGRvY3VtZW50IGZyYWdtZW50IHJlcHJlc2VudGluZyB0aGUgcmVzcG9uc2UgSFRNTCwgaW5jbHVkaW5nXG4gICAqIGEgYHRpdGxlYCBwcm9wZXJ0eSBmb3IgYW55IHRpdGxlIGluZm9ybWF0aW9uIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2UgSFRNTFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VGcmFnbWVudChyZXNwb25zZSkge1xuICAgIC8vIHN0cmlwIGhlYWQgdGFnIHRvIGRldGVybWluZSBzaGFwZSBvZiByZXNwb25zZSB3ZSBhcmUgZGVhbGluZyB3aXRoXG4gICAgY29uc3QgcmVzcG9uc2VXaXRoTm9IZWFkID0gcmVzcG9uc2UucmVwbGFjZShIRUFEX1RBR19SRUdFWCwgJycpXG4gICAgY29uc3Qgc3RhcnRUYWcgPSBnZXRTdGFydFRhZyhyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi9cbiAgICBsZXQgZnJhZ21lbnRcbiAgICBpZiAoc3RhcnRUYWcgPT09ICdodG1sJykge1xuICAgICAgLy8gaWYgaXQgaXMgYSBmdWxsIGRvY3VtZW50LCBwYXJzZSBpdCBhbmQgcmV0dXJuIHRoZSBib2R5XG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIGlmIChzdGFydFRhZyA9PT0gJ2JvZHknKSB7XG4gICAgICAvLyBwYXJzZSBib2R5IHcvbyB3cmFwcGluZyBpbiB0ZW1wbGF0ZVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgbm9uLWJvZHkgcGFydGlhbCBIVE1MIGNvbnRlbnQsIHNvIHdyYXAgaXQgaW4gYSB0ZW1wbGF0ZSB0byBtYXhpbWl6ZSBwYXJzaW5nIGZsZXhpYmlsaXR5XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwoJzxib2R5Pjx0ZW1wbGF0ZSBjbGFzcz1cImludGVybmFsLWh0bXgtd3JhcHBlclwiPicgKyByZXNwb25zZVdpdGhOb0hlYWQgKyAnPC90ZW1wbGF0ZT48L2JvZHk+JylcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKGRvYy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpLmNvbnRlbnQpXG4gICAgICAvLyBleHRyYWN0IHRpdGxlIGludG8gZnJhZ21lbnQgZm9yIGxhdGVyIHByb2Nlc3NpbmdcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG5cbiAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyB3ZSBzdXBwb3J0IGEgdGl0bGUgdGFnIGF0IHRoZSByb290IGxldmVsIG9mIG5vbi1ib2R5IHJlc3BvbnNlcywgc28gd2UgbmVlZCB0byBoYW5kbGUgaXRcbiAgICAgIHZhciB0aXRsZUVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbGVtZW50ICYmIHRpdGxlRWxlbWVudC5wYXJlbnROb2RlID09PSBmcmFnbWVudCkge1xuICAgICAgICB0aXRsZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgICAgZnJhZ21lbnQudGl0bGUgPSB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93U2NyaXB0VGFncykge1xuICAgICAgICBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBzY3JpcHQgdGFncyBpZiBzY3JpcHRzIGFyZSBkaXNhYmxlZFxuICAgICAgICBmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKS5mb3JFYWNoKChzY3JpcHQpID0+IHNjcmlwdC5yZW1vdmUoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVDYWxsKGZ1bmMpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgZnVuYygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBpc1R5cGUobywgdHlwZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIEZ1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIE9iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUmF3T2JqZWN0KG8pIHtcbiAgICByZXR1cm4gaXNUeXBlKG8sICdPYmplY3QnKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9uSGFuZGxlclxuICAgKiBAcHJvcGVydHkgeyhrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwKXxzdHJpbmd9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RlbmVySW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IG9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14Tm9kZUludGVybmFsRGF0YVxuICAgKiBFbGVtZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbml0SGFzaF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYm9vc3RlZF1cbiAgICogQHByb3BlcnR5IHtPbkhhbmRsZXJbXX0gW29uSGFuZGxlcnNdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHByb3BlcnR5IHtMaXN0ZW5lckluZm9bXX0gW2xpc3RlbmVySW5mb3NdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhbmNlbGxlZF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdHJpZ2dlcmVkT25jZV1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheWVkXVxuICAgKiBAcHJvcGVydHkge251bWJlcnxudWxsfSBbdGhyb3R0bGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFzdFZhbHVlXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2FkZWRdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJiXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwb2xsaW5nXVxuICAgKiBAcHJvcGVydHkge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8bnVsbH0gW2xhc3RCdXR0b25DbGlja2VkXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3JlcXVlc3RDb3VudF1cbiAgICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0gW3hocl1cbiAgICogQHByb3BlcnR5IHsoKCkgPT4gdm9pZClbXX0gW3F1ZXVlZFJlcXVlc3RzXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthYm9ydGFibGVdXG4gICAqXG4gICAqIEV2ZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IFt0cmlnZ2VyU3BlY11cbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldFtdfSBbaGFuZGxlZEZvcl1cbiAgICovXG5cbiAgLyoqXG4gICAqIGdldEludGVybmFsRGF0YSByZXRyaWV2ZXMgXCJwcml2YXRlXCIgZGF0YSBzdG9yZWQgYnkgaHRteCB3aXRoaW4gYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEV2ZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxEYXRhKGVsdCkge1xuICAgIGNvbnN0IGRhdGFQcm9wID0gJ2h0bXgtaW50ZXJuYWwtZGF0YSdcbiAgICBsZXQgZGF0YSA9IGVsdFtkYXRhUHJvcF1cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGRhdGEgPSBlbHRbZGF0YVByb3BdID0ge31cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0FycmF5IGNvbnZlcnRzIGFuIEFycmF5TGlrZSBvYmplY3QgaW50byBhIHJlYWwgYXJyYXkuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHJldHVybnMge1RbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkoYXJyKSB7XG4gICAgY29uc3QgcmV0dXJuQXJyID0gW11cbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXR1cm5BcnIucHVzaChhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5BcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1RbXXxOYW1lZE5vZGVNYXB8SFRNTENvbGxlY3Rpb258SFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb258QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHBhcmFtIHsoVCkgPT4gdm9pZH0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gZm9yRWFjaChhcnIsIGZ1bmMpIHtcbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBmdW5jKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsZWRJbnRvVmlldyhlbCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGVsZW1Ub3AgPSByZWN0LnRvcFxuICAgIGNvbnN0IGVsZW1Cb3R0b20gPSByZWN0LmJvdHRvbVxuICAgIHJldHVybiBlbGVtVG9wIDwgd2luZG93LmlubmVySGVpZ2h0ICYmIGVsZW1Cb3R0b20gPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gYm9keUNvbnRhaW5zKGVsdCkge1xuICAgIC8vIElFIEZpeFxuICAgIGNvbnN0IHJvb3ROb2RlID0gZWx0LmdldFJvb3ROb2RlICYmIGVsdC5nZXRSb290Tm9kZSgpXG4gICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QpIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMocm9vdE5vZGUuaG9zdClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHNwbGl0T25XaGl0ZXNwYWNlKHRyaWdnZXIpIHtcbiAgICByZXR1cm4gdHJpZ2dlci50cmltKCkuc3BsaXQoL1xccysvKVxuICB9XG5cbiAgLyoqXG4gICAqIG1lcmdlT2JqZWN0cyB0YWtlcyBhbGwgdGhlIGtleXMgZnJvbVxuICAgKiBvYmoyIGFuZCBkdXBsaWNhdGVzIHRoZW0gaW50byBvYmoxXG4gICAqIEB0ZW1wbGF0ZSBUMVxuICAgKiBAdGVtcGxhdGUgVDJcbiAgICogQHBhcmFtIHtUMX0gb2JqMVxuICAgKiBAcGFyYW0ge1QyfSBvYmoyXG4gICAqIEByZXR1cm5zIHtUMSAmIFQyfVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmoyKSB7XG4gICAgICBpZiAob2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgcmV0dXJuIG9iajFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30galN0cmluZ1xuICAgKiBAcmV0dXJucyB7YW55fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUpTT04oalN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShqU3RyaW5nKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dFcnJvcihlcnJvcilcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkge1xuICAgIGNvbnN0IHRlc3QgPSAnaHRteDpsb2NhbFN0b3JhZ2VUZXN0J1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KVxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoKVxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBwYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCB1bmxlc3MgaW5kZXggcGFnZVxuICAgICAgaWYgKCEoL15cXC8kLy50ZXN0KHBhdGgpKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBiZSBraW5kIHRvIElFMTEsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBVUkwoKVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHVibGljIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gaW50ZXJuYWxFdmFsKHN0cikge1xuICAgIHJldHVybiBtYXliZUV2YWwoZ2V0RG9jdW1lbnQoKS5ib2R5LCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBldmFsKHN0cilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjYWxsYmFjayBmb3IgdGhlICoqaHRteDpsb2FkKiogZXZlbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvY2VzcyBuZXcgY29udGVudCwgZm9yIGV4YW1wbGUgaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50IHdpdGggYSBqYXZhc2NyaXB0IGxpYnJhcnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25Mb2FkXG4gICAqXG4gICAqIEBwYXJhbSB7KGVsdDogTm9kZSkgPT4gdm9pZH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGNhbGwgb24gbmV3bHkgbG9hZGVkIGNvbnRlbnRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvbkxvYWRIZWxwZXIoY2FsbGJhY2spIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0bXgub24oJ2h0bXg6bG9hZCcsIC8qKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldnQgKi8gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjYWxsYmFjayhldnQuZGV0YWlsLmVsdClcbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIExvZyBhbGwgaHRteCBldmVudHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dBbGxcbiAgICovXG4gIGZ1bmN0aW9uIGxvZ0FsbCgpIHtcbiAgICBodG14LmxvZ2dlciA9IGZ1bmN0aW9uKGVsdCwgZXZlbnQsIGRhdGEpIHtcbiAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LCBlbHQsIGRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nTm9uZSgpIHtcbiAgICBodG14LmxvZ2dlciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudCBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZEFsbFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudHMgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD59XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQWxsKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRBbGwoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgV2luZG93XG4gICAqL1xuICBmdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHdpbmRvd1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsdCwgZGVsYXkpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUVsZW1lbnQoZWx0KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RWx0KGVsdCkucmVtb3ZlQ2hpbGQoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0h0bWxFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqIEByZXR1cm4ge1BhcmVudE5vZGV8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzUGFyZW50Tm9kZShlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFkZHMgYSBjbGFzcyB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWRkQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgY2xhc3MgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byBhZGRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSBjbGFzcyBpcyBhZGRlZFxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eiwgZGVsYXkpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0LmNsYXNzTGlzdCAmJiBlbHQuY2xhc3NMaXN0LmFkZChjbGF6eilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsYXNzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gbm9kZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgY2xhc3MgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgY2xhc3MgaXMgcmVtb3ZlZClcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQobm9kZSwgY2xhenosIGRlbGF5KSB7XG4gICAgbGV0IGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KG5vZGUpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShjbGF6eilcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGNsYXNzZXMgbGVmdCwgcmVtb3ZlIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGdpdmVuIGNsYXNzIG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdG9nZ2xlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRvZ2dsZSB0aGUgY2xhc3Mgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0b2dnbGVcbiAgICovXG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzT25FbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBlbHQuY2xhc3NMaXN0LnRvZ2dsZShjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSBpdHMgc2libGluZ3MsIHNvIHRoYXQgYW1vbmcgaXRzIHNpYmxpbmdzLCBvbmx5IHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Rha2VDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRha2UgdGhlIGNsYXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdGFrZVxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNsYXNzRm9yRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZm9yRWFjaChlbHQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXp6KVxuICAgIH0pXG4gICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGVsdCksIGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjbG9zZXN0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzIHBhcmVudGFnZSwgaW5jbHVzaXZlIG9mIHRoZSBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2Nsb3Nlc3RcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIHNlbGVjdG9yIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBmaW5kXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZXN0KGVsdCwgc2VsZWN0b3IpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmIChlbHQgJiYgZWx0LmNsb3Nlc3QpIHtcbiAgICAgIHJldHVybiBlbHQuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyByZW1vdmUgd2hlbiBJRSBnb2VzIGF3YXlcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGVsdCA9PSBudWxsIHx8IG1hdGNoZXMoZWx0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbHQgPSBlbHQgJiYgYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSlcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwcmVmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzdWZmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgPT09IHN1ZmZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICBjb25zdCB0cmltbWVkU2VsZWN0b3IgPSBzZWxlY3Rvci50cmltKClcbiAgICBpZiAoc3RhcnRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICc8JykgJiYgZW5kc1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnLz4nKSkge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3Rvci5zdWJzdHJpbmcoMSwgdHJpbW1lZFNlbGVjdG9yLmxlbmd0aCAtIDIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfEVsZW1lbnR8RG9jdW1lbnR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLCBnbG9iYWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoc2VsZWN0b3IuaW5kZXhPZignY2xvc2VzdCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtjbG9zZXN0KGFzRWxlbWVudChlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOCkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2ZpbmQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbZmluZChhc1BhcmVudE5vZGUoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ25leHQnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLm5leHRFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ25leHQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkZvcndhcmRRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncHJldmlvdXMnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdwcmV2aW91cyAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuQmFja3dhcmRzUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudF1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnd2luZG93Jykge1xuICAgICAgcmV0dXJuIFt3aW5kb3ddXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2JvZHknKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50LmJvZHldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3Jvb3QnKSB7XG4gICAgICByZXR1cm4gW2dldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZ2xvYmFsICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLnNsaWNlKDcpLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdG9BcnJheShhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkZvcndhcmRRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5CYWNrd2FyZHNRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd31cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3RvcilbMF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZ2V0RG9jdW1lbnQoKS5ib2R5LCBlbHRPclNlbGVjdG9yKVswXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge0V2ZW50VGFyZ2V0fSBUXG4gICAqIEBwYXJhbSB7VHxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtUfSBbY29udGV4dF1cbiAgICogQHJldHVybnMge0VsZW1lbnR8VHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVRhcmdldChlbHRPclNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZpbmQoYXNQYXJlbnROb2RlKGNvbnRleHQpIHx8IGRvY3VtZW50LCBlbHRPclNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7a2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcHxzdHJpbmd9IEFueUV2ZW50TmFtZVxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXZlbnRBcmdzXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICAgKiBAcHJvcGVydHkge0FueUV2ZW50TmFtZX0gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxBbnlFdmVudE5hbWV9IGFyZzFcbiAgICogQHBhcmFtIHtBbnlFdmVudE5hbWV8RXZlbnRMaXN0ZW5lcn0gYXJnMlxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXVxuICAgKiBAcmV0dXJucyB7RXZlbnRBcmdzfVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oYXJnMikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogZ2V0RG9jdW1lbnQoKS5ib2R5LFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMSksXG4gICAgICAgIGxpc3RlbmVyOiBhcmcyXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogcmVzb2x2ZVRhcmdldChhcmcxKSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzIpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnM1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBsaXN0ZW5lciB0byB8IHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3IgfCB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICBjb25zdCBiID0gaXNGdW5jdGlvbihhcmcyKVxuICAgIHJldHVybiBiID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvZmZcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oYXJnMikgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTm9kZSBwcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3QgRFVNTVlfRUxUID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdvdXRwdXQnKSAvLyBkdW1teSBlbGVtZW50IGZvciBiYWQgc2VsZWN0b3JzXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ck5hbWVcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgYXR0ck5hbWUpIHtcbiAgICBjb25zdCBhdHRyVGFyZ2V0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0ck5hbWUpXG4gICAgaWYgKGF0dHJUYXJnZXQpIHtcbiAgICAgIGlmIChhdHRyVGFyZ2V0ID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIFtmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyTmFtZSldXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgYXR0clRhcmdldClcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsb2dFcnJvcignVGhlIHNlbGVjdG9yIFwiJyArIGF0dHJUYXJnZXQgKyAnXCIgb24gJyArIGF0dHJOYW1lICsgJyByZXR1cm5lZCBubyBtYXRjaGVzIScpXG4gICAgICAgICAgcmV0dXJuIFtEVU1NWV9FTFRdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBhc0VsZW1lbnQoZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoYXNFbGVtZW50KGVsdCksIGF0dHJpYnV0ZSkgIT0gbnVsbFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VGFyZ2V0KGVsdCkge1xuICAgIGNvbnN0IHRhcmdldFN0ciA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKVxuICAgIGlmICh0YXJnZXRTdHIpIHtcbiAgICAgIGlmICh0YXJnZXRTdHIgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRhcmdldFN0cilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAoZGF0YS5ib29zdGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUobmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXNUb1NldHRsZSA9IGh0bXguY29uZmlnLmF0dHJpYnV0ZXNUb1NldHRsZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlc1RvU2V0dGxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmFtZSA9PT0gYXR0cmlidXRlc1RvU2V0dGxlW2ldKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VUb1xuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlRnJvbVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvbmVBdHRyaWJ1dGVzKG1lcmdlVG8sIG1lcmdlRnJvbSkge1xuICAgIGZvckVhY2gobWVyZ2VUby5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoIW1lcmdlRnJvbS5oYXNBdHRyaWJ1dGUoYXR0ci5uYW1lKSAmJiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKG1lcmdlRnJvbS5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpIHtcbiAgICBjb25zdCBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyh0YXJnZXQpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzSW5saW5lU3dhcChzd2FwU3R5bGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFN0eWxlID09PSAnb3V0ZXJIVE1MJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvb2JWYWx1ZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9vYkVsZW1lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGxldCBzZWxlY3RvciA9ICcjJyArIGdldFJhd0F0dHJpYnV0ZShvb2JFbGVtZW50LCAnaWQnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFN0eWxlICovXG4gICAgbGV0IHN3YXBTdHlsZSA9ICdvdXRlckhUTUwnXG4gICAgaWYgKG9vYlZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKG9vYlZhbHVlLmluZGV4T2YoJzonKSA+IDApIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlLnN1YnN0cigwLCBvb2JWYWx1ZS5pbmRleE9mKCc6JykpXG4gICAgICBzZWxlY3RvciA9IG9vYlZhbHVlLnN1YnN0cihvb2JWYWx1ZS5pbmRleE9mKCc6JykgKyAxLCBvb2JWYWx1ZS5sZW5ndGgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICBpZiAodGFyZ2V0cykge1xuICAgICAgZm9yRWFjaChcbiAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgICAgbGV0IGZyYWdtZW50XG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudENsb25lID0gb29iRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICBmcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQob29iRWxlbWVudENsb25lKVxuICAgICAgICAgIGlmICghaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBhc1BhcmVudE5vZGUob29iRWxlbWVudENsb25lKSAvLyBpZiB0aGlzIGlzIG5vdCBhbiBpbmxpbmUgc3dhcCwgd2UgdXNlIHRoZSBjb250ZW50IG9mIHRoZSBub2RlLCBub3QgdGhlIG5vZGUgaXRzZWxmXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlU3dhcERldGFpbHMgPSB7IHNob3VsZFN3YXA6IHRydWUsIHRhcmdldCwgZnJhZ21lbnQgfVxuICAgICAgICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6b29iQmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICAgICAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgICAgICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgICAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCB0YXJnZXQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14Om9vYkFmdGVyU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6b29iRXJyb3JOb1RhcmdldCcsIHsgY29udGVudDogb29iRWxlbWVudCB9KVxuICAgIH1cbiAgICByZXR1cm4gb29iVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudCkge1xuICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ1toeC1wcmVzZXJ2ZV0sIFtkYXRhLWh4LXByZXNlcnZlXScpLCBmdW5jdGlvbihwcmVzZXJ2ZWRFbHQpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0QXR0cmlidXRlVmFsdWUocHJlc2VydmVkRWx0LCAnaWQnKVxuICAgICAgY29uc3Qgb2xkRWx0ID0gZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgIGlmIChvbGRFbHQgIT0gbnVsbCkge1xuICAgICAgICBwcmVzZXJ2ZWRFbHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQob2xkRWx0LCBwcmVzZXJ2ZWRFbHQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyksIGZ1bmN0aW9uKG5ld05vZGUpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UmF3QXR0cmlidXRlKG5ld05vZGUsICdpZCcpXG4gICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkSWQgPSBpZC5yZXBsYWNlKFwiJ1wiLCBcIlxcXFwnXCIpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYWcgPSBuZXdOb2RlLnRhZ05hbWUucmVwbGFjZSgnOicsICdcXFxcOicpXG4gICAgICAgIGNvbnN0IHBhcmVudEVsdCA9IGFzUGFyZW50Tm9kZShwYXJlbnROb2RlKVxuICAgICAgICBjb25zdCBvbGROb2RlID0gcGFyZW50RWx0ICYmIHBhcmVudEVsdC5xdWVyeVNlbGVjdG9yKG5vcm1hbGl6ZWRUYWcgKyBcIltpZD0nXCIgKyBub3JtYWxpemVkSWQgKyBcIiddXCIpXG4gICAgICAgIGlmIChvbGROb2RlICYmIG9sZE5vZGUgIT09IHBhcmVudEVsdCkge1xuICAgICAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBuZXdOb2RlLmNsb25lTm9kZSgpXG4gICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG9sZE5vZGUpXG4gICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG5ld0F0dHJpYnV0ZXMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBjaGlsZFxuICAgKiBAcmV0dXJucyB7SHRteFNldHRsZVRhc2t9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlQWpheExvYWRUYXNrKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHByb2Nlc3NOb2RlKGFzRWxlbWVudChjaGlsZCkpXG4gICAgICBwcm9jZXNzRm9jdXMoYXNQYXJlbnROb2RlKGNoaWxkKSlcbiAgICAgIHRyaWdnZXJFdmVudChjaGlsZCwgJ2h0bXg6bG9hZCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gY2hpbGRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NGb2N1cyhjaGlsZCkge1xuICAgIGNvbnN0IGF1dG9mb2N1cyA9ICdbYXV0b2ZvY3VzXSdcbiAgICBjb25zdCBhdXRvRm9jdXNlZEVsdCA9IGFzSHRtbEVsZW1lbnQobWF0Y2hlcyhjaGlsZCwgYXV0b2ZvY3VzKSA/IGNoaWxkIDogY2hpbGQucXVlcnlTZWxlY3RvcihhdXRvZm9jdXMpKVxuICAgIGlmIChhdXRvRm9jdXNlZEVsdCAhPSBudWxsKSB7XG4gICAgICBhdXRvRm9jdXNlZEVsdC5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge05vZGV9IGluc2VydEJlZm9yZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydEJlZm9yZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIHdoaWxlIChmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZFxuICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGNoaWxkKSwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbnNlcnRCZWZvcmUpXG4gICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJhc2VkIG9uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2h5YW1hbW90by9mZDQzNTUwNWQyOWViZmEzZDk3MTZmZDJiZThkNDJmMCxcbiAgICogZGVyaXZlZCBmcm9tIEphdmEncyBzdHJpbmcgaGFzaGNvZGUgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaGFzaFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nSGFzaChzdHJpbmcsIGhhc2gpIHtcbiAgICBsZXQgY2hhciA9IDBcbiAgICB3aGlsZSAoY2hhciA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBzdHJpbmcuY2hhckNvZGVBdChjaGFyKyspIHwgMCAvLyBiaXR3aXNlIG9yIGVuc3VyZXMgd2UgaGF2ZSBhIDMyLWJpdCBpbnRcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYXR0cmlidXRlSGFzaChlbHQpIHtcbiAgICBsZXQgaGFzaCA9IDBcbiAgICAvLyBJRSBmaXhcbiAgICBpZiAoZWx0LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWx0LmF0dHJpYnV0ZXNbaV1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZS52YWx1ZSkgeyAvLyBvbmx5IGluY2x1ZGUgYXR0cmlidXRlcyB3LyBhY3R1YWwgdmFsdWVzIChlbXB0eSBpcyBzYW1lIGFzIG5vbi1leGlzdGVudClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUubmFtZSwgaGFzaClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUudmFsdWUsIGhhc2gpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE9uSGFuZGxlcnMoZWx0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZm8gPSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1tpXVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChlbHQsIGhhbmRsZXJJbmZvLmV2ZW50LCBoYW5kbGVySW5mby5saXN0ZW5lcilcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE5vZGUoZWxlbWVudCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbGVtZW50KVxuICAgIGlmIChpbnRlcm5hbERhdGEudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVybmFsRGF0YS50aW1lb3V0KVxuICAgIH1cbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MpIHtcbiAgICAgIGZvckVhY2goaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MsIGZ1bmN0aW9uKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8ub24pIHtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChpbmZvLm9uLCBpbmZvLnRyaWdnZXIsIGluZm8ubGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWxlbWVudClcbiAgICBmb3JFYWNoKE9iamVjdC5rZXlzKGludGVybmFsRGF0YSksIGZ1bmN0aW9uKGtleSkgeyBkZWxldGUgaW50ZXJuYWxEYXRhW2tleV0gfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuVXBFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKVxuICAgIGRlSW5pdE5vZGUoZWxlbWVudClcbiAgICAvLyBAdHMtaWdub3JlIElFMTEgY29kZVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikgeyAvLyBJRVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yRWFjaChlbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkgeyBjbGVhblVwRWxlbWVudChjaGlsZCkgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiB0YXJnZXQudGFnTmFtZSA9PT0gJ0JPRFknKSB7IC8vIHNwZWNpYWwgY2FzZSB0aGUgYm9keSB0byBpbm5lckhUTUwgYmVjYXVzZSBEb2N1bWVudEZyYWdtZW50cyBjYW4ndCBjb250YWluIGEgYm9keSBlbHQgdW5mb3J0dW5hdGVseVxuICAgICAgcmV0dXJuIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtOb2RlfSAqL1xuICAgIGxldCBuZXdFbHRcbiAgICBjb25zdCBlbHRCZWZvcmVOZXdDb250ZW50ID0gdGFyZ2V0LnByZXZpb3VzU2libGluZ1xuICAgIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChlbHRCZWZvcmVOZXdDb250ZW50ID09IG51bGwpIHtcbiAgICAgIG5ld0VsdCA9IHBhcmVudEVsdCh0YXJnZXQpLmZpcnN0Q2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWx0ID0gZWx0QmVmb3JlTmV3Q29udGVudC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBzZXR0bGVJbmZvLmVsdHMgPSBzZXR0bGVJbmZvLmVsdHMuZmlsdGVyKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUgIT09IHRhcmdldCB9KVxuICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgbmV3bHkgYWRkZWQgY29udGVudCBhbmQgYWRkIGFsbCBlbGVtZW50cyB0byB0aGUgc2V0dGxlIGluZm8gc28gd2UgdHJpZ2dlclxuICAgIC8vIGV2ZW50cyBwcm9wZXJseSBvbiB0aGVtXG4gICAgd2hpbGUgKG5ld0VsdCAmJiBuZXdFbHQgIT09IHRhcmdldCkge1xuICAgICAgaWYgKG5ld0VsdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgc2V0dGxlSW5mby5lbHRzLnB1c2gobmV3RWx0KVxuICAgICAgfVxuICAgICAgbmV3RWx0ID0gbmV3RWx0Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGFyZ2V0LnJlbW92ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgdGFyZ2V0LmZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBudWxsLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQubmV4dFNpYmxpbmcsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqL1xuICBmdW5jdGlvbiBzd2FwRGVsZXRlKHRhcmdldCkge1xuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICByZXR1cm4gcGFyZW50RWx0KHRhcmdldCkucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgY29uc3QgZmlyc3RDaGlsZCA9IHRhcmdldC5maXJzdENoaWxkXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBmaXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgd2hpbGUgKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICB9XG4gICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkKVxuICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHN3aXRjaCAoc3dhcFN0eWxlKSB7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdvdXRlckhUTUwnOlxuICAgICAgICBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJiZWdpbic6XG4gICAgICAgIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlYmVnaW4nOlxuICAgICAgICBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmVlbmQnOlxuICAgICAgICBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJlbmQnOlxuICAgICAgICBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBzd2FwRGVsZXRlKHRhcmdldClcbiAgICAgICAgcmV0dXJuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMoZWx0KVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBleHRlbnNpb25zW2ldXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZXh0LmhhbmRsZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0VsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGhhbmRsZVN3YXAgcmV0dXJucyBhbiBhcnJheSAobGlrZSkgb2YgZWxlbWVudHMsIHdlIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdFbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBuZXdFbGVtZW50c1tqXVxuICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3dhcFN0eWxlID09PSAnaW5uZXJIVE1MJykge1xuICAgICAgICAgIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2FwV2l0aFN0eWxlKGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICB2YXIgb29iRWx0cyA9IGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtc3dhcC1vb2JdLCBbZGF0YS1oeC1zd2FwLW9vYl0nKVxuICAgIGZvckVhY2gob29iRWx0cywgZnVuY3Rpb24ob29iRWxlbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93TmVzdGVkT29iU3dhcHMgfHwgb29iRWxlbWVudC5wYXJlbnRFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG9vYlZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUob29iRWxlbWVudCwgJ2h4LXN3YXAtb29iJylcbiAgICAgICAgaWYgKG9vYlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaHgtc3dhcC1vb2InKVxuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oeC1zd2FwLW9vYicpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gb29iRWx0cy5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBjb21wbGV0ZSBzd2FwcGluZyBwaXBlbGluZSwgaW5jbHVkaW5nOiBmb2N1cyBhbmQgc2VsZWN0aW9uIHByZXNlcnZhdGlvbixcbiAgICogdGl0bGUgdXBkYXRlcywgc2Nyb2xsLCBPT0Igc3dhcHBpbmcsIG5vcm1hbCBzd2FwcGluZyBhbmQgc2V0dGxpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKiBAcGFyYW0ge1N3YXBPcHRpb25zfSBbc3dhcE9wdGlvbnNdXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwKHRhcmdldCwgY29udGVudCwgc3dhcFNwZWMsIHN3YXBPcHRpb25zKSB7XG4gICAgaWYgKCFzd2FwT3B0aW9ucykge1xuICAgICAgc3dhcE9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIHRhcmdldCA9IHJlc29sdmVUYXJnZXQodGFyZ2V0KVxuXG4gICAgLy8gcHJlc2VydmUgZm9jdXMgYW5kIHNlbGVjdGlvblxuICAgIGNvbnN0IGFjdGl2ZUVsdCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICBsZXQgc2VsZWN0aW9uSW5mbyA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIHNlbGVjdGlvbkluZm8gPSB7XG4gICAgICAgIGVsdDogYWN0aXZlRWx0LFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXJ0OiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uU3RhcnQgOiBudWxsLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVuZDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvbkVuZCA6IG51bGxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzYWZhcmkgaXNzdWUgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9wbGF5d3JpZ2h0L2lzc3Vlcy81ODk0XG4gICAgfVxuICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpXG5cbiAgICAvLyBGb3IgdGV4dCBjb250ZW50IHN3YXBzLCBkb24ndCBwYXJzZSB0aGUgcmVzcG9uc2UgYXMgSFRNTCwganVzdCBpbnNlcnQgaXRcbiAgICBpZiAoc3dhcFNwZWMuc3dhcFN0eWxlID09PSAndGV4dENvbnRlbnQnKSB7XG4gICAgICB0YXJnZXQudGV4dENvbnRlbnQgPSBjb250ZW50XG4gICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBmcmFnbWVudCBhbmQgcHJvY2VzcyBpdFxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY29udGVudClcblxuICAgICAgc2V0dGxlSW5mby50aXRsZSA9IGZyYWdtZW50LnRpdGxlXG5cbiAgICAgIC8vIHNlbGVjdC1vb2Igc3dhcHNcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3RPT0IpIHtcbiAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWVzID0gc3dhcE9wdGlvbnMuc2VsZWN0T09CLnNwbGl0KCcsJylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvb2JTZWxlY3RWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlc1tpXS5zcGxpdCgnOicsIDIpXG4gICAgICAgICAgbGV0IGlkID0gb29iU2VsZWN0VmFsdWVbMF0udHJpbSgpXG4gICAgICAgICAgaWYgKGlkLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcoMSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBvb2JTZWxlY3RWYWx1ZVsxXSB8fCAndHJ1ZSdcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignIycgKyBpZClcbiAgICAgICAgICBpZiAob29iRWxlbWVudCkge1xuICAgICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9vYiBzd2Fwc1xuICAgICAgZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ3RlbXBsYXRlJyksIC8qKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlICovZnVuY3Rpb24odGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGZpbmRBbmRTd2FwT29iRWxlbWVudHModGVtcGxhdGUuY29udGVudCwgc2V0dGxlSW5mbykpIHtcbiAgICAgICAgICAvLyBBdm9pZCBwb2xsdXRpbmcgdGhlIERPTSB3aXRoIGVtcHR5IHRlbXBsYXRlcyB0aGF0IHdlcmUgb25seSB1c2VkIHRvIGVuY2Fwc3VsYXRlIG9vYiBzd2FwXG4gICAgICAgICAgdGVtcGxhdGUucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gbm9ybWFsIHN3YXBcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3QpIHtcbiAgICAgICAgY29uc3QgbmV3RnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3dhcE9wdGlvbnMuc2VsZWN0KSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIG5ld0ZyYWdtZW50LmFwcGVuZENoaWxkKG5vZGUpXG4gICAgICAgIH0pXG4gICAgICAgIGZyYWdtZW50ID0gbmV3RnJhZ21lbnRcbiAgICAgIH1cbiAgICAgIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KVxuICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3BlYy5zd2FwU3R5bGUsIHN3YXBPcHRpb25zLmNvbnRleHRFbGVtZW50LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cblxuICAgIC8vIGFwcGx5IHNhdmVkIGZvY3VzIGFuZCBzZWxlY3Rpb24gaW5mb3JtYXRpb24gdG8gc3dhcHBlZCBjb250ZW50XG4gICAgaWYgKHNlbGVjdGlvbkluZm8uZWx0ICYmXG4gICAgICAhYm9keUNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZWx0KSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSkge1xuICAgICAgY29uc3QgbmV3QWN0aXZlRWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSlcbiAgICAgIGNvbnN0IGZvY3VzT3B0aW9ucyA9IHsgcHJldmVudFNjcm9sbDogc3dhcFNwZWMuZm9jdXNTY3JvbGwgIT09IHVuZGVmaW5lZCA/ICFzd2FwU3BlYy5mb2N1c1Njcm9sbCA6ICFodG14LmNvbmZpZy5kZWZhdWx0Rm9jdXNTY3JvbGwgfVxuICAgICAgaWYgKG5ld0FjdGl2ZUVsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChzZWxlY3Rpb25JbmZvLnN0YXJ0ICYmIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uSW5mby5zdGFydCwgc2VsZWN0aW9uSW5mby5lbmQpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdGhlIHNldFNlbGVjdGlvblJhbmdlIG1ldGhvZCBpcyBwcmVzZW50IG9uIGZpZWxkcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQsIHNvIGp1c3QgbGV0IHRoaXMgZmFpbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdBY3RpdmVFbHQuZm9jdXMoZm9jdXNPcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG4gICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU3dhcCcsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICB9KVxuICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaykge1xuICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2soKVxuICAgIH1cblxuICAgIC8vIG1lcmdlIGluIG5ldyB0aXRsZSBhZnRlciBzd2FwIGJ1dCBiZWZvcmUgc2V0dGxlXG4gICAgaWYgKCFzd2FwU3BlYy5pZ25vcmVUaXRsZSkge1xuICAgICAgaGFuZGxlVGl0bGUoc2V0dGxlSW5mby50aXRsZSlcbiAgICB9XG5cbiAgICAvLyBzZXR0bGVcbiAgICBjb25zdCBkb1NldHRsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLnRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgIHRhc2suY2FsbCgpXG4gICAgICB9KVxuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTZXR0bGUnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgICB9KVxuXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYW5jaG9yKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclRhcmdldCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KCcjJyArIHN3YXBPcHRpb25zLmFuY2hvcikpXG4gICAgICAgIGlmIChhbmNob3JUYXJnZXQpIHtcbiAgICAgICAgICBhbmNob3JUYXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6ICdhdXRvJyB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVNjcm9sbFN0YXRlKHNldHRsZUluZm8uZWx0cywgc3dhcFNwZWMpXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaykge1xuICAgICAgICBzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3dhcFNwZWMuc2V0dGxlRGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU2V0dGxlLCBzd2FwU3BlYy5zZXR0bGVEZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TZXR0bGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCBoZWFkZXIsIGVsdCkge1xuICAgIGNvbnN0IHRyaWdnZXJCb2R5ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlcilcbiAgICBpZiAodHJpZ2dlckJvZHkuaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICBjb25zdCB0cmlnZ2VycyA9IHBhcnNlSlNPTih0cmlnZ2VyQm9keSlcbiAgICAgIGZvciAoY29uc3QgZXZlbnROYW1lIGluIHRyaWdnZXJzKSB7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgICAgbGV0IGRldGFpbCA9IHRyaWdnZXJzW2V2ZW50TmFtZV1cbiAgICAgICAgICBpZiAoaXNSYXdPYmplY3QoZGV0YWlsKSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWx0ID0gZGV0YWlsLnRhcmdldCAhPT0gdW5kZWZpbmVkID8gZGV0YWlsLnRhcmdldCA6IGVsdFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRhaWwgPSB7IHZhbHVlOiBkZXRhaWwgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBldmVudE5hbWVzID0gdHJpZ2dlckJvZHkuc3BsaXQoJywnKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZXNbaV0udHJpbSgpLCBbXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBXSElURVNQQUNFID0gL1xccy9cbiAgY29uc3QgV0hJVEVTUEFDRV9PUl9DT01NQSA9IC9bXFxzLF0vXG4gIGNvbnN0IFNZTUJPTF9TVEFSVCA9IC9bXyRhLXpBLVpdL1xuICBjb25zdCBTWU1CT0xfQ09OVCA9IC9bXyRhLXpBLVowLTldL1xuICBjb25zdCBTVFJJTkdJU0hfU1RBUlQgPSBbJ1wiJywgXCInXCIsICcvJ11cbiAgY29uc3QgTk9UX1dISVRFU1BBQ0UgPSAvW15cXHNdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVCA9IC9beyhdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQgPSAvW30pXS9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZVN0cmluZyhzdHIpIHtcbiAgICAvKiogQHR5cGUgc3RyaW5nW10gKi9cbiAgICBjb25zdCB0b2tlbnMgPSBbXVxuICAgIGxldCBwb3NpdGlvbiA9IDBcbiAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoKSB7XG4gICAgICBpZiAoU1lNQk9MX1NUQVJULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbikpKSB7XG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgd2hpbGUgKFNZTUJPTF9DT05ULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbiArIDEpKSkge1xuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIGlmIChTVFJJTkdJU0hfU1RBUlQuaW5kZXhPZihzdHIuY2hhckF0KHBvc2l0aW9uKSkgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2hhciA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoICYmIHN0ci5jaGFyQXQocG9zaXRpb24pICE9PSBzdGFydENoYXIpIHtcbiAgICAgICAgICBpZiAoc3RyLmNoYXJBdChwb3NpdGlvbikgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHRva2Vucy5wdXNoKHN5bWJvbClcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9uKytcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBsYXN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkge1xuICAgIHJldHVybiBTWU1CT0xfU1RBUlQuZXhlYyh0b2tlbi5jaGFyQXQoMCkpICYmXG4gICAgICB0b2tlbiAhPT0gJ3RydWUnICYmXG4gICAgICB0b2tlbiAhPT0gJ2ZhbHNlJyAmJlxuICAgICAgdG9rZW4gIT09ICd0aGlzJyAmJlxuICAgICAgdG9rZW4gIT09IHBhcmFtTmFtZSAmJlxuICAgICAgbGFzdCAhPT0gJy4nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Q29uZGl0aW9uYWxGdW5jdGlvbnxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCBwYXJhbU5hbWUpIHtcbiAgICBpZiAodG9rZW5zWzBdID09PSAnWycpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICBsZXQgYnJhY2tldENvdW50ID0gMVxuICAgICAgbGV0IGNvbmRpdGlvbmFsU291cmNlID0gJyByZXR1cm4gKGZ1bmN0aW9uKCcgKyBwYXJhbU5hbWUgKyAnKXsgcmV0dXJuICgnXG4gICAgICBsZXQgbGFzdCA9IG51bGxcbiAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1swXVxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBzaGlmdCBjYWxsLCBhbmQgdGhpbmtzIHdlJ3JlIGNvbXBhcmluZyB0aGUgc2FtZSB2YWx1ZSBoZXJlLCBpLmUuICdbJyB2cyAnXSdcbiAgICAgICAgaWYgKHRva2VuID09PSAnXScpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQtLVxuICAgICAgICAgIGlmIChicmFja2V0Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChsYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyAndHJ1ZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKX0pJ1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uRnVuY3Rpb24gPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oY29uZGl0aW9uYWxTb3VyY2UpKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pXG4gICAgICAgICAgICAgIGNvbmRpdGlvbkZ1bmN0aW9uLnNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlXG4gICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25GdW5jdGlvblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnN5bnRheDplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZTogY29uZGl0aW9uYWxTb3VyY2UgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdbJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudCsrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSkge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcoKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpID8gKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpIDogKHdpbmRvdy4nICsgdG9rZW4gKyAnKSknXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArIHRva2VuXG4gICAgICAgIH1cbiAgICAgICAgbGFzdCA9IHRva2Vucy5zaGlmdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gbWF0Y2hcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbCh0b2tlbnMsIG1hdGNoKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmICFtYXRjaC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHJlc3VsdCArPSB0b2tlbnMuc2hpZnQoKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKSB7XG4gICAgbGV0IHJlc3VsdFxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMCAmJiBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQpLnRyaW0oKVxuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY29uc3QgSU5QVVRfU0VMRUNUT1IgPSAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBsaWNpdFRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIGZvciB0cmlnZ2VyIHNwZWNzXG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSkge1xuICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXSAqL1xuICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVTdHJpbmcoZXhwbGljaXRUcmlnZ2VyKVxuICAgIGRvIHtcbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IHRva2Vucy5sZW5ndGhcbiAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLylcbiAgICAgIGlmICh0cmlnZ2VyICE9PSAnJykge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2V2ZXJ5Jykge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCBldmVyeSA9IHsgdHJpZ2dlcjogJ2V2ZXJ5JyB9XG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgZXZlcnkucG9sbEludGVydmFsID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLykpXG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgZXZlcnkuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaChldmVyeSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgdHJpZ2dlclNwZWMgPSB7IHRyaWdnZXIgfVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXSAhPT0gJywnKSB7XG4gICAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gJ2NoYW5nZWQnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnb25jZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMub25jZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdjb25zdW1lJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jb25zdW1lID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2RlbGF5JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5kZWxheSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZnJvbScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgaWYgKENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgICAgICBpZiAoZnJvbV9hcmcgPT09ICdjbG9zZXN0JyB8fCBmcm9tX2FyZyA9PT0gJ2ZpbmQnIHx8IGZyb21fYXJnID09PSAnbmV4dCcgfHwgZnJvbV9hcmcgPT09ICdwcmV2aW91cycpIHtcbiAgICAgICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgICAgICAvLyBgbmV4dGAgYW5kIGBwcmV2aW91c2AgYWxsb3cgYSBzZWxlY3Rvci1sZXNzIHN5bnRheFxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbV9hcmcgKz0gJyAnICsgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZnJvbSA9IGZyb21fYXJnXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGFyZ2V0JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50YXJnZXQgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Rocm90dGxlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50aHJvdHRsZSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncXVldWUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnF1ZXVlID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdyb290JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RocmVzaG9sZCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2godHJpZ2dlclNwZWMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSBpbml0aWFsTGVuZ3RoKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgIH0gd2hpbGUgKHRva2Vuc1swXSA9PT0gJywnICYmIHRva2Vucy5zaGlmdCgpKVxuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSA9IHRyaWdnZXJTcGVjc1xuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VHJpZ2dlclNwZWNzKGVsdCkge1xuICAgIGNvbnN0IGV4cGxpY2l0VHJpZ2dlciA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRyaWdnZXInKVxuICAgIGxldCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGlmIChleHBsaWNpdFRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gaHRteC5jb25maWcudHJpZ2dlclNwZWNzQ2FjaGVcbiAgICAgIHRyaWdnZXJTcGVjcyA9IChjYWNoZSAmJiBjYWNoZVtleHBsaWNpdFRyaWdnZXJdKSB8fCBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpXG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJTcGVjcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdzdWJtaXQnIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJidXR0b25cIl0sIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCBJTlBVVF9TRUxFQ1RPUikpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2hhbmdlJyB9XVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gY2FuY2VsUG9sbGluZyhlbHQpIHtcbiAgICBnZXRJbnRlcm5hbERhdGEoZWx0KS5jYW5jZWxsZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gc3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIG5vZGVEYXRhLnRpbWVvdXQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGJvZHlDb250YWlucyhlbHQpICYmIG5vZGVEYXRhLmNhbmNlbGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQoc3BlYywgZWx0LCBtYWtlRXZlbnQoJ2h4OnBvbGw6dHJpZ2dlcicsIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlYzogc3BlYyxcbiAgICAgICAgICB0YXJnZXQ6IGVsdFxuICAgICAgICB9KSkpIHtcbiAgICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpXG4gICAgICB9XG4gICAgfSwgc3BlYy5wb2xsSW50ZXJ2YWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MQW5jaG9yRWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNMb2NhbExpbmsoZWx0KSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uLmhvc3RuYW1lID09PSBlbHQuaG9zdG5hbWUgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpICE9PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGVsdElzRGlzYWJsZWQoZWx0KSB7XG4gICAgcmV0dXJuIGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqL1xuICBmdW5jdGlvbiBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgaWYgKChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBpc0xvY2FsTGluayhlbHQpICYmIChlbHQudGFyZ2V0ID09PSAnJyB8fCBlbHQudGFyZ2V0ID09PSAnX3NlbGYnKSkgfHwgKGVsdC50YWdOYW1lID09PSAnRk9STScgJiYgU3RyaW5nKGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKSkudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpKSB7XG4gICAgICBub2RlRGF0YS5ib29zdGVkID0gdHJ1ZVxuICAgICAgbGV0IHZlcmIsIHBhdGhcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgIHZlcmIgPSAnZ2V0J1xuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3QXR0cmlidXRlID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpXG4gICAgICAgIHZlcmIgPSByYXdBdHRyaWJ1dGUgPyByYXdBdHRyaWJ1dGUudG9Mb3dlckNhc2UoKSA6ICdnZXQnXG4gICAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgICB9XG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnYWN0aW9uJylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgfSwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZENhbmNlbChldnQsIG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChldnQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZXZ0LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwic3VibWl0XCJdLCBidXR0b24nKSAmJiBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGVsdC5ocmVmICYmXG4gICAgICAgIChlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT09ICcjJyB8fCBlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykuaW5kZXhPZignIycpICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fE1vdXNlRXZlbnR8S2V5Ym9hcmRFdmVudHxUb3VjaEV2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZXZ0LnR5cGUgPT09ICdjbGljaycgJiZcbiAgICAgIC8vIEB0cy1pZ25vcmUgdGhpcyB3aWxsIHJlc29sdmUgdG8gdW5kZWZpbmVkIGZvciBldmVudHMgdGhhdCBkb24ndCBkZWZpbmUgdGhvc2UgcHJvcGVydGllcywgd2hpY2ggaXMgZmluZVxuICAgICAgKGV2dC5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkge1xuICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXJcbiAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEZpbHRlci5jYWxsKGVsdCwgZXZ0KSAhPT0gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmVudEZpbHRlci5zb3VyY2VcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpldmVudEZpbHRlcjplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtleHBsaWNpdENhbmNlbF1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIGV4cGxpY2l0Q2FuY2VsKSB7XG4gICAgY29uc3QgZWxlbWVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIC8qKiBAdHlwZSB7KE5vZGV8V2luZG93KVtdfSAqL1xuICAgIGxldCBlbHRzVG9MaXN0ZW5PblxuICAgIGlmICh0cmlnZ2VyU3BlYy5mcm9tKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCB0cmlnZ2VyU3BlYy5mcm9tKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IFtlbHRdXG4gICAgfVxuICAgIC8vIHN0b3JlIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMsIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXkgY2hhbmdlXG4gICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uLmZvckVhY2goZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgfSlcbiAgICB9XG4gICAgZm9yRWFjaChlbHRzVG9MaXN0ZW5PbiwgZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGVsdFRvTGlzdGVuT24ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBsaWNpdENhbmNlbCB8fCBzaG91bGRDYW5jZWwoZXZ0LCBlbHQpKSB7XG4gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2dClcbiAgICAgICAgZXZlbnREYXRhLnRyaWdnZXJTcGVjID0gdHJpZ2dlclNwZWNcbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yID09IG51bGwpIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvciA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yLmluZGV4T2YoZWx0KSA8IDApIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvci5wdXNoKGVsdClcbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY29uc3VtZSkge1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50YXJnZXQgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKGFzRWxlbWVudChldnQudGFyZ2V0KSwgdHJpZ2dlclNwZWMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLm9uY2UpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgICAgICAgaWYgKGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEuZGVsYXllZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVsZW1lbnREYXRhLmRlbGF5ZWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocm90dGxlID4gMCkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gbnVsbFxuICAgICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy50aHJvdHRsZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLmRlbGF5ID4gMCkge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZGVsYXllZCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub2RlRGF0YS5saXN0ZW5lckluZm9zID09IG51bGwpIHtcbiAgICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcyA9IFtdXG4gICAgICB9XG4gICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyU3BlYy50cmlnZ2VyLFxuICAgICAgICBsaXN0ZW5lcjogZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgb246IGVsdFRvTGlzdGVuT25cbiAgICAgIH0pXG4gICAgICBlbHRUb0xpc3Rlbk9uLmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICB9KVxuICB9XG5cbiAgbGV0IHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2UgLy8gdXNlZCBieSBpbml0U2Nyb2xsSGFuZGxlclxuICBsZXQgc2Nyb2xsSGFuZGxlciA9IG51bGxcbiAgZnVuY3Rpb24gaW5pdFNjcm9sbEhhbmRsZXIoKSB7XG4gICAgaWYgKCFzY3JvbGxIYW5kbGVyKSB7XG4gICAgICBzY3JvbGxIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgICAgfVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpXG4gICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHdpbmRvd0lzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgICAgICAgIGZvckVhY2goZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXIqPSdyZXZlYWxlZCddLFtkYXRhLWh4LXRyaWdnZXIqPSdyZXZlYWxlZCddXCIpLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIG1heWJlUmV2ZWFsKGVsdClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVJldmVhbChlbHQpIHtcbiAgICBpZiAoIWhhc0F0dHJpYnV0ZShlbHQsICdkYXRhLWh4LXJldmVhbGVkJykgJiYgaXNTY3JvbGxlZEludG9WaWV3KGVsdCkpIHtcbiAgICAgIGVsdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaHgtcmV2ZWFsZWQnLCAndHJ1ZScpXG4gICAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAobm9kZURhdGEuaW5pdEhhc2gpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZSBub2RlIGlzbid0IGluaXRpYWxpemVkLCB3YWl0IGZvciBpdCBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgcmVxdWVzdFxuICAgICAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphZnRlclByb2Nlc3NOb2RlJywgZnVuY3Rpb24oKSB7IHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpIH0sIHsgb25jZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5XG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSW1tZWRpYXRlbHkoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgZGVsYXkpIHtcbiAgICBjb25zdCBsb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW5vZGVEYXRhLmxvYWRlZCkge1xuICAgICAgICBub2RlRGF0YS5sb2FkZWQgPSB0cnVlXG4gICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGxvYWQsIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGxldCBleHBsaWNpdEFjdGlvbiA9IGZhbHNlXG4gICAgZm9yRWFjaChWRVJCUywgZnVuY3Rpb24odmVyYikge1xuICAgICAgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC0nICsgdmVyYikpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LScgKyB2ZXJiKVxuICAgICAgICBleHBsaWNpdEFjdGlvbiA9IHRydWVcbiAgICAgICAgbm9kZURhdGEucGF0aCA9IHBhdGhcbiAgICAgICAgbm9kZURhdGEudmVyYiA9IHZlcmJcbiAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGV4cGxpY2l0QWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQGNhbGxiYWNrIFRyaWdnZXJIYW5kbGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IFtldnRdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKi9cbiAgZnVuY3Rpb24gYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGhhbmRsZXIpIHtcbiAgICBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ3JldmVhbGVkJykge1xuICAgICAgaW5pdFNjcm9sbEhhbmRsZXIoKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICAgIG1heWJlUmV2ZWFsKGFzRWxlbWVudChlbHQpKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2ludGVyc2VjdCcpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyT3B0aW9ucyA9IHt9XG4gICAgICBpZiAodHJpZ2dlclNwZWMucm9vdCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMucm9vdCA9IHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0cmlnZ2VyU3BlYy5yb290KVxuICAgICAgfVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocmVzaG9sZCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMudGhyZXNob2xkID0gcGFyc2VGbG9hdCh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpXG4gICAgICB9XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlbnRyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXVxuICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2ludGVyc2VjdCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgb2JzZXJ2ZXJPcHRpb25zKVxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShhc0VsZW1lbnQoZWx0KSlcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdsb2FkJykge1xuICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIG1ha2VFdmVudCgnbG9hZCcsIHsgZWx0IH0pKSkge1xuICAgICAgICBsb2FkSW1tZWRpYXRlbHkoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnBvbGxJbnRlcnZhbCA+IDApIHtcbiAgICAgIG5vZGVEYXRhLnBvbGxpbmcgPSB0cnVlXG4gICAgICBwcm9jZXNzUG9sbGluZyhhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3NIeE9uKG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbHQuYXR0cmlidXRlc1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdLm5hbWVcbiAgICAgIGlmIChzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb246JykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb246JykgfHxcbiAgICAgICAgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uLScpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uLScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBjb25zdCBIWF9PTl9RVUVSWSA9IG5ldyBYUGF0aEV2YWx1YXRvcigpXG4gICAgLmNyZWF0ZUV4cHJlc3Npb24oJy4vLypbQCpbIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbjpcIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb246XCIpIG9yJyArXG4gICAgICAnIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbi1cIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb24tXCIpIF1dJylcblxuICBmdW5jdGlvbiBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cykge1xuICAgIGlmIChzaG91bGRQcm9jZXNzSHhPbihlbHQpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChlbHQpKVxuICAgIH1cbiAgICBjb25zdCBpdGVyID0gSFhfT05fUVVFUlkuZXZhbHVhdGUoZWx0KVxuICAgIGxldCBub2RlID0gbnVsbFxuICAgIHdoaWxlIChub2RlID0gaXRlci5pdGVyYXRlTmV4dCgpKSBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChub2RlKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpIHtcbiAgICAvKiogQHR5cGUge0VsZW1lbnRbXX0gKi9cbiAgICBjb25zdCBlbGVtZW50cyA9IFtdXG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWx0LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgcHJvY2Vzc0hYT25Sb290KGNoaWxkLCBlbGVtZW50cylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpXG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCkge1xuICAgIGlmIChlbHQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgY29uc3QgYm9vc3RlZFNlbGVjdG9yID0gJywgW2h4LWJvb3N0XSBhLCBbZGF0YS1oeC1ib29zdF0gYSwgYVtoeC1ib29zdF0sIGFbZGF0YS1oeC1ib29zdF0nXG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvblNlbGVjdG9ycyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGUgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2VdXG4gICAgICAgIGlmIChleHRlbnNpb24uZ2V0U2VsZWN0b3JzKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMoKVxuICAgICAgICAgIGlmIChzZWxlY3RvcnMpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvblNlbGVjdG9ycy5wdXNoKHNlbGVjdG9ycylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGVsdC5xdWVyeVNlbGVjdG9yQWxsKFZFUkJfU0VMRUNUT1IgKyBib29zdGVkU2VsZWN0b3IgKyBcIiwgZm9ybSwgW3R5cGU9J3N1Ym1pdCddLFwiICtcbiAgICAgICAgJyBbaHgtZXh0XSwgW2RhdGEtaHgtZXh0XSwgW2h4LXRyaWdnZXJdLCBbZGF0YS1oeC10cmlnZ2VyXScgKyBleHRlbnNpb25TZWxlY3RvcnMuZmxhdCgpLm1hcChzID0+ICcsICcgKyBzKS5qb2luKCcnKSlcblxuICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICogc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gKi8gKGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIikpXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBlbHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIilcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGZvcm0gPSByZXNvbHZlVGFyZ2V0KCcjJyArIGdldFJhd0F0dHJpYnV0ZShlbHQsICdmb3JtJyksIGVsdC5nZXRSb290Tm9kZSgpKSB8fCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKVxuICAgIGlmICghZm9ybSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXRCdXR0b25UcmFja2luZyhlbHQpIHtcbiAgICAvLyBuZWVkIHRvIGhhbmRsZSBib3RoIGNsaWNrIGFuZCBmb2N1cyBpbjpcbiAgICAvLyAgIGZvY3VzaW4gLSBpbiBjYXNlIHNvbWVvbmUgdGFicyBpbiB0byBhIGJ1dHRvbiBhbmQgaGl0cyB0aGUgc3BhY2UgYmFyXG4gICAgLy8gICBjbGljayAtIG9uIE9TWCBidXR0b25zIGRvIG5vdCBmb2N1cyBvbiBjbGljayBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzI0XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGVcbiAgICovXG4gIGZ1bmN0aW9uIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIGNvZGUpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGVEYXRhLm9uSGFuZGxlcnMpKSB7XG4gICAgICBub2RlRGF0YS5vbkhhbmRsZXJzID0gW11cbiAgICB9XG4gICAgbGV0IGZ1bmNcbiAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICBmdW5jID0gbmV3IEZ1bmN0aW9uKCdldmVudCcsIGNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgZnVuYy5jYWxsKGVsdCwgZSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgbm9kZURhdGEub25IYW5kbGVycy5wdXNoKHsgZXZlbnQ6IGV2ZW50TmFtZSwgbGlzdGVuZXIgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0h4T25XaWxkY2FyZChlbHQpIHtcbiAgICAvLyB3aXBlIGFueSBwcmV2aW91cyBvbiBoYW5kbGVycyBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMgcHJlY2VkZW5jZVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWx0KVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGNvbnN0IHZhbHVlID0gZWx0LmF0dHJpYnV0ZXNbaV0udmFsdWVcbiAgICAgIGlmIChzdGFydHNXaXRoKG5hbWUsICdoeC1vbicpIHx8IHN0YXJ0c1dpdGgobmFtZSwgJ2RhdGEtaHgtb24nKSkge1xuICAgICAgICBjb25zdCBhZnRlck9uUG9zaXRpb24gPSBuYW1lLmluZGV4T2YoJy1vbicpICsgM1xuICAgICAgICBjb25zdCBuZXh0Q2hhciA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uLCBhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICBpZiAobmV4dENoYXIgPT09ICctJyB8fCBuZXh0Q2hhciA9PT0gJzonKSB7XG4gICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgICAvLyBpZiB0aGUgZXZlbnROYW1lIHN0YXJ0cyB3aXRoIGEgY29sb24gb3IgZGFzaCwgcHJlcGVuZCBcImh0bXhcIiBmb3Igc2hvcnRoYW5kIHN1cHBvcnRcbiAgICAgICAgICBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICc6JykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14JyArIGV2ZW50TmFtZVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICctJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoMSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnaHRteC0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSg1KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXROb2RlKGVsdCkge1xuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAobm9kZURhdGEuaW5pdEhhc2ggIT09IGF0dHJpYnV0ZUhhc2goZWx0KSkge1xuICAgICAgLy8gY2xlYW4gdXAgYW55IHByZXZpb3VzbHkgcHJvY2Vzc2VkIGluZm9cbiAgICAgIGRlSW5pdE5vZGUoZWx0KVxuXG4gICAgICBub2RlRGF0YS5pbml0SGFzaCA9IGF0dHJpYnV0ZUhhc2goZWx0KVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpXG5cbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgaWYgKGVsdC52YWx1ZSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG5vZGVEYXRhLmxhc3RWYWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBnZXRUcmlnZ2VyU3BlY3MoZWx0KVxuICAgICAgY29uc3QgaGFzRXhwbGljaXRIdHRwQWN0aW9uID0gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcblxuICAgICAgaWYgKCFoYXNFeHBsaWNpdEh0dHBBY3Rpb24pIHtcbiAgICAgICAgaWYgKGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1ib29zdCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuICAgICAgICB9IGVsc2UgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC10cmlnZ2VyJykpIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgICAgLy8gRm9yIFwibmFrZWRcIiB0cmlnZ2VycywgZG9uJ3QgZG8gYW55dGhpbmcgYXQgYWxsXG4gICAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nIHx8IChnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JyAmJiBoYXNBdHRyaWJ1dGUoZWx0LCAnZm9ybScpKSkge1xuICAgICAgICBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclByb2Nlc3NOb2RlJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIG5ldyBjb250ZW50LCBlbmFibGluZyBodG14IGJlaGF2aW9yLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgY29udGVudCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBET00gb3V0c2lkZSBvZiB0aGUgbm9ybWFsIGh0bXggcmVxdWVzdCBjeWNsZSBidXQgc3RpbGwgd2FudCBodG14IGF0dHJpYnV0ZXMgdG8gd29yay5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcHJvY2Vzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgZWxlbWVudCB0byBwcm9jZXNzXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShlbHQpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpbml0Tm9kZShlbHQpXG4gICAgZm9yRWFjaChmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSwgZnVuY3Rpb24oY2hpbGQpIHsgaW5pdE5vZGUoY2hpbGQpIH0pXG4gICAgZm9yRWFjaChmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSwgcHJvY2Vzc0h4T25XaWxkY2FyZClcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV2ZW50L0xvZyBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRldGFpbFxuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgLy8gVGhpcyBicmVha3MgZXhwZWN0ZWQgZW5jYXBzdWxhdGlvbiBidXQgbmVlZHMgdG8gYmUgaGVyZSB1bnRpbCBkZWNpZGVkIG90aGVyd2lzZSBieSBjb3JlIGRldnNcbiAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBldnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsXG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXJyb3JFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZXZlbnROYW1lIH0sIGRldGFpbCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpIHtcbiAgICByZXR1cm4gZXZlbnROYW1lID09PSAnaHRteDphZnRlclByb2Nlc3NOb2RlJ1xuICB9XG5cbiAgLyoqXG4gICAqIGB3aXRoRXh0ZW5zaW9uc2AgbG9jYXRlcyBhbGwgYWN0aXZlIGV4dGVuc2lvbnMgZm9yIGEgcHJvdmlkZWQgZWxlbWVudCwgdGhlblxuICAgKiBleGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdXNpbmcgZWFjaCBvZiB0aGUgYWN0aXZlIGV4dGVuc2lvbnMuICBJdCBzaG91bGRcbiAgICogYmUgY2FsbGVkIGludGVybmFsbHkgYXQgZXZlcnkgZXh0ZW5kYWJsZSBleGVjdXRpb24gcG9pbnQgaW4gaHRteC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHsoZXh0ZW5zaW9uOkh0bXhFeHRlbnNpb24pID0+IHZvaWR9IHRvRG9cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aEV4dGVuc2lvbnMoZWx0LCB0b0RvKSB7XG4gICAgZm9yRWFjaChnZXRFeHRlbnNpb25zKGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9EbyhleHRlbnNpb24pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ0Vycm9yKG1zZykge1xuICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1zZylcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICBjb25zb2xlLmxvZygnRVJST1I6ICcsIG1zZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBnaXZlbiBldmVudCBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RyaWdnZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byB0cmlnZ2VyXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsIGRldGFpbHMgZm9yIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRldGFpbCA9PSBudWxsKSB7XG4gICAgICBkZXRhaWwgPSB7fVxuICAgIH1cbiAgICBkZXRhaWwuZWx0ID0gZWx0XG4gICAgY29uc3QgZXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgaWYgKGh0bXgubG9nZ2VyICYmICFpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSkge1xuICAgICAgaHRteC5sb2dnZXIoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICB9XG4gICAgaWYgKGRldGFpbC5lcnJvcikge1xuICAgICAgbG9nRXJyb3IoZGV0YWlsLmVycm9yKVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6ZXJyb3InLCB7IGVycm9ySW5mbzogZGV0YWlsIH0pXG4gICAgfVxuICAgIGxldCBldmVudFJlc3VsdCA9IGVsdC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGtlYmFiTmFtZSA9IGtlYmFiRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAgICBpZiAoZXZlbnRSZXN1bHQgJiYga2ViYWJOYW1lICE9PSBldmVudE5hbWUpIHtcbiAgICAgIGNvbnN0IGtlYmFiZWRFdmVudCA9IG1ha2VFdmVudChrZWJhYk5hbWUsIGV2ZW50LmRldGFpbClcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgZWx0LmRpc3BhdGNoRXZlbnQoa2ViYWJlZEV2ZW50KVxuICAgIH1cbiAgICB3aXRoRXh0ZW5zaW9ucyhhc0VsZW1lbnQoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIChleHRlbnNpb24ub25FdmVudChldmVudE5hbWUsIGV2ZW50KSAhPT0gZmFsc2UgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgfSlcbiAgICByZXR1cm4gZXZlbnRSZXN1bHRcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhpc3RvcnkgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsZXQgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAvKipcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRIaXN0b3J5RWxlbWVudCgpIHtcbiAgICBjb25zdCBoaXN0b3J5RWx0ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpXG4gICAgcmV0dXJuIGhpc3RvcnlFbHQgfHwgZ2V0RG9jdW1lbnQoKS5ib2R5XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbHRcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVUb0hpc3RvcnlDYWNoZSh1cmwsIHJvb3RFbHQpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgc3RhdGUgdG8gc2F2ZVxuICAgIGNvbnN0IGlubmVySFRNTCA9IGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShyb290RWx0KVxuICAgIGNvbnN0IHRpdGxlID0gZ2V0RG9jdW1lbnQoKS50aXRsZVxuICAgIGNvbnN0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSA8PSAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbiBldmVudHVhbGx5IGFscmVhZHkgZXhpc3RpbmcgY2FjaGUgaXMgcHVyZ2VkXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICBoaXN0b3J5Q2FjaGUuc3BsaWNlKGksIDEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIEh0bXhIaXN0b3J5SXRlbSAqL1xuICAgIGNvbnN0IG5ld0hpc3RvcnlJdGVtID0geyB1cmwsIGNvbnRlbnQ6IGlubmVySFRNTCwgdGl0bGUsIHNjcm9sbCB9XG5cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5SXRlbUNyZWF0ZWQnLCB7IGl0ZW06IG5ld0hpc3RvcnlJdGVtLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG5cbiAgICBoaXN0b3J5Q2FjaGUucHVzaChuZXdIaXN0b3J5SXRlbSlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUpIHtcbiAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpXG4gICAgfVxuXG4gICAgLy8ga2VlcCB0cnlpbmcgdG8gc2F2ZSB0aGUgY2FjaGUgdW50aWwgaXQgc3VjY2VlZHMgb3IgaXMgZW1wdHlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5Q2FjaGUpKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZUVycm9yJywgeyBjYXVzZTogZSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuICAgICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKSAvLyBzaHJpbmsgdGhlIGNhY2hlIGFuZCByZXRyeVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeUl0ZW1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNjcm9sbFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcmV0dXJucyB7SHRteEhpc3RvcnlJdGVtfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDYWNoZWRIaXN0b3J5KHVybCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIHJldHVybiBoaXN0b3J5Q2FjaGVbaV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KGVsdCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGh0bXguY29uZmlnLnJlcXVlc3RDbGFzc1xuICAgIGNvbnN0IGNsb25lID0gLyoqIEB0eXBlIEVsZW1lbnQgKi8gKGVsdC5jbG9uZU5vZGUodHJ1ZSkpXG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnLicgKyBjbGFzc05hbWUpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhc3NOYW1lKVxuICAgIH0pXG4gICAgLy8gcmVtb3ZlIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgZm9yIGFueSBlbGVtZW50IGRpc2FibGVkIGR1ZSB0byBhbiBodG14IHJlcXVlc3RcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICdbZGF0YS1kaXNhYmxlZC1ieS1odG14XScpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgfSlcbiAgICByZXR1cm4gY2xvbmUuaW5uZXJIVE1MXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKSB7XG4gICAgY29uc3QgZWx0ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50UGF0aEZvckhpc3RvcnkgfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAgIC8vIEFsbG93IGhpc3Rvcnkgc25hcHNob3QgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCB3aGVyZSBoeC1oaXN0b3J5PVwiZmFsc2VcIlxuICAgIC8vIGlzIHByZXNlbnQgKmFueXdoZXJlKiBpbiB0aGUgY3VycmVudCBkb2N1bWVudCB3ZSdyZSBhYm91dCB0byBzYXZlLFxuICAgIC8vIHNvIHdlIGNhbiBwcmV2ZW50IHByaXZpbGVnZWQgZGF0YSBlbnRlcmluZyB0aGUgY2FjaGUuXG4gICAgLy8gVGhlIHBhZ2Ugd2lsbCBzdGlsbCBiZSByZWFjaGFibGUgYXMgYSBoaXN0b3J5IGVudHJ5LCBidXQgaHRteCB3aWxsIGZldGNoIGl0XG4gICAgLy8gbGl2ZSBmcm9tIHRoZSBzZXJ2ZXIgb25wb3BzdGF0ZSByYXRoZXIgdGhhbiBsb29rIGluIHRoZSBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICBsZXQgZGlzYWJsZUhpc3RvcnlDYWNoZVxuICAgIHRyeSB7XG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0nKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJRTExOiBpbnNlbnNpdGl2ZSBtb2RpZmllciBub3Qgc3VwcG9ydGVkIHNvIGZhbGxiYWNrIHRvIGNhc2Ugc2Vuc2l0aXZlIHNlbGVjdG9yXG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCJdLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiXScpXG4gICAgfVxuICAgIGlmICghZGlzYWJsZUhpc3RvcnlDYWNoZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVNhdmUnLCB7IHBhdGgsIGhpc3RvcnlFbHQ6IGVsdCB9KVxuICAgICAgc2F2ZVRvSGlzdG9yeUNhY2hlKHBhdGgsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCBnZXREb2N1bWVudCgpLnRpdGxlLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcHVzaFVybEludG9IaXN0b3J5KHBhdGgpIHtcbiAgLy8gcmVtb3ZlIHRoZSBjYWNoZSBidXN0ZXIgcGFyYW1ldGVyLCBpZiBhbnlcbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvb3JnXFwuaHRteFxcLmNhY2hlLWJ1c3Rlcj1bXiZdKiY/LywgJycpXG4gICAgICBpZiAoZW5kc1dpdGgocGF0aCwgJyYnKSB8fCBlbmRzV2l0aChwYXRoLCAnPycpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIHtcbiAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICB9XG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlVXJsSW5IaXN0b3J5KHBhdGgpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0dGxlSW1tZWRpYXRlbHkodGFza3MpIHtcbiAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICB0YXNrLmNhbGwodW5kZWZpbmVkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgY29uc3QgZGV0YWlscyA9IHsgcGF0aCwgeGhyOiByZXF1ZXN0IH1cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzJywgZGV0YWlscylcbiAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1DdXJyZW50LVVSTCcsIGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZilcbiAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZCcsIGRldGFpbHMpXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KHRoaXMucmVzcG9uc2UpXG4gICAgICAgIC8qKiBAdHlwZSBQYXJlbnROb2RlICovXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpIHx8IGZyYWdtZW50XG4gICAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuXG4gICAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGNvbnRlbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGNhY2hlTWlzczogdHJ1ZSwgc2VydmVyUmVzcG9uc2U6IHRoaXMucmVzcG9uc2UgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWRFcnJvcicsIGRldGFpbHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3Quc2VuZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzdG9yZUhpc3RvcnkocGF0aCkge1xuICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgcGF0aCA9IHBhdGggfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRIaXN0b3J5KHBhdGgpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY2FjaGVkLmNvbnRlbnQpXG4gICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGNhY2hlZC5zY3JvbGwpXG4gICAgICB9LCAwKSAvLyBuZXh0ICd0aWNrJywgc28gYnJvd3NlciBoYXMgdGltZSB0byByZW5kZXIgbGF5b3V0XG4gICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgaXRlbTogY2FjaGVkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5yZWZyZXNoT25IaXN0b3J5TWlzcykge1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gcmVsb2FkKCkgZnVuY3Rpb24gdGhyb3dzIGVycm9yXG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpIHtcbiAgICBsZXQgaW5kaWNhdG9ycyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluZGljYXRvcicpKVxuICAgIGlmIChpbmRpY2F0b3JzID09IG51bGwpIHtcbiAgICAgIGluZGljYXRvcnMgPSBbZWx0XVxuICAgIH1cbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBpYy5jbGFzc0xpc3QuYWRkLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgfSlcbiAgICByZXR1cm4gaW5kaWNhdG9yc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBkaXNhYmxlRWxlbWVudHMoZWx0KSB7XG4gICAgbGV0IGRpc2FibGVkRWx0cyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWRpc2FibGVkLWVsdCcpKVxuICAgIGlmIChkaXNhYmxlZEVsdHMgPT0gbnVsbCkge1xuICAgICAgZGlzYWJsZWRFbHRzID0gW11cbiAgICB9XG4gICAgZm9yRWFjaChkaXNhYmxlZEVsdHMsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnLCAnJylcbiAgICB9KVxuICAgIHJldHVybiBkaXNhYmxlZEVsdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gaW5kaWNhdG9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVkKSB7XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgaWMuY2xhc3NMaXN0LnJlbW92ZS5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChkaXNhYmxlZCwgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnB1dCBWYWx1ZSBQcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IHByb2Nlc3NlZFtpXVxuICAgICAgaWYgKG5vZGUuaXNTYW1lTm9kZShlbHQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkSW5jbHVkZShlbGVtZW50KSB7XG4gICAgLy8gQ2FzdCB0byB0cmljayB0c2MsIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCB3b3JrIGZpbmUgaGVyZVxuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudH0gKi8gKGVsZW1lbnQpXG4gICAgaWYgKGVsdC5uYW1lID09PSAnJyB8fCBlbHQubmFtZSA9PSBudWxsIHx8IGVsdC5kaXNhYmxlZCB8fCBjbG9zZXN0KGVsdCwgJ2ZpZWxkc2V0W2Rpc2FibGVkXScpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgLy8gaWdub3JlIFwic3VibWl0dGVyXCIgdHlwZXMgKHNlZSBqUXVlcnkgc3JjL3NlcmlhbGl6ZS5qcylcbiAgICBpZiAoZWx0LnR5cGUgPT09ICdidXR0b24nIHx8IGVsdC50eXBlID09PSAnc3VibWl0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ltYWdlJyB8fCBlbHQudGFnTmFtZSA9PT0gJ3Jlc2V0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGVsdC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsdC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm4gZWx0LmNoZWNrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheXxGb3JtRGF0YUVudHJ5VmFsdWV9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxldCB2YWx1ZXMgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdmFsdWUuaW5kZXhPZih2KSA8IDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpXG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgIGZvckVhY2godmFsdWVzLCB2ID0+IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudHxIVE1MU2VsZWN0RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpIHtcbiAgICBpZiAoZWx0ID09IG51bGwgfHwgaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NlZC5wdXNoKGVsdClcbiAgICB9XG4gICAgaWYgKHNob3VsZEluY2x1ZGUoZWx0KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJylcbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgbGV0IHZhbHVlID0gZWx0LnZhbHVlXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgZWx0Lm11bHRpcGxlKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uOmNoZWNrZWQnKSkubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuICgvKiogQHR5cGUgSFRNTE9wdGlvbkVsZW1lbnQgKi8oZSkpLnZhbHVlIH0pXG4gICAgICB9XG4gICAgICAvLyBpbmNsdWRlIGZpbGUgaW5wdXRzXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbHQuZmlsZXMpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5maWxlcylcbiAgICAgIH1cbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGVsdC5lbGVtZW50cywgZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHByb2Nlc3NlZC5pbmRleE9mKGlucHV0KSA+PSAwKSB7XG4gICAgICAgICAgLy8gVGhlIGlucHV0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZCBhZGRlZCB0byB0aGUgdmFsdWVzLCBidXQgdGhlIEZvcm1EYXRhIHRoYXQgd2lsbCBiZVxuICAgICAgICAgIC8vICBjb25zdHJ1Y3RlZCByaWdodCBhZnRlciBvbiB0aGUgZm9ybSwgd2lsbCBpbmNsdWRlIGl0IG9uY2UgYWdhaW4uIFNvIHJlbW92ZSB0aGF0IGlucHV0J3MgdmFsdWVcbiAgICAgICAgICAvLyAgbm93IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShpbnB1dC5uYW1lLCBpbnB1dC52YWx1ZSwgZm9ybURhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1c2goaW5wdXQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgICAgdmFsaWRhdGVFbGVtZW50KGlucHV0LCBlcnJvcnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBuZXcgRm9ybURhdGEoZWx0KS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgJiYgdmFsdWUubmFtZSA9PT0gJycpIHtcbiAgICAgICAgICByZXR1cm4gLy8gaWdub3JlIG5vLW5hbWUgZmlsZXNcbiAgICAgICAgfVxuICAgICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICovXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50ICYgRWxlbWVudEludGVybmFsc30gKi8gKGVsdClcbiAgICBpZiAoZWxlbWVudC53aWxsVmFsaWRhdGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOnZhbGlkYXRlJylcbiAgICAgIGlmICghZWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBlbHQ6IGVsZW1lbnQsIG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOmZhaWxlZCcsIHsgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBvbmUgRm9ybURhdGEgd2l0aCB0aG9zZSBmcm9tIGFub3RoZXIuXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IHJlY2VpdmVyIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBkb25vciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIG92ZXJyaWRpbmcgdmFsdWVzXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX0gdGhlIHtAbGlua2NvZGUgcmVjZWl2ZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvdmVycmlkZUZvcm1EYXRhKHJlY2VpdmVyLCBkb25vcikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGRvbm9yLmtleXMoKSkge1xuICAgICAgcmVjZWl2ZXIuZGVsZXRlKGtleSlcbiAgICB9XG4gICAgZG9ub3IuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZWNlaXZlci5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZWNlaXZlclxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEByZXR1cm5zIHt7ZXJyb3JzOiBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdLCBmb3JtRGF0YTogRm9ybURhdGEsIHZhbHVlczogT2JqZWN0fX1cbiAqL1xuICBmdW5jdGlvbiBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpIHtcbiAgICAvKiogQHR5cGUgRWxlbWVudFtdICovXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gW11cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgY29uc3QgcHJpb3JpdHlGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgLyoqIEB0eXBlIEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCAmJiAhYm9keUNvbnRhaW5zKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBvbmx5IHZhbGlkYXRlIHdoZW4gZm9ybSBpcyBkaXJlY3RseSBzdWJtaXR0ZWQgYW5kIG5vdmFsaWRhdGUgb3IgZm9ybW5vdmFsaWRhdGUgYXJlIG5vdCBzZXRcbiAgICAvLyBvciBpZiB0aGUgZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgaHgtdmFsaWRhdGU9XCJ0cnVlXCIgb24gaXRcbiAgICBsZXQgdmFsaWRhdGUgPSAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmIGVsdC5ub1ZhbGlkYXRlICE9PSB0cnVlKSB8fCBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC12YWxpZGF0ZScpID09PSAndHJ1ZSdcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSB7XG4gICAgICB2YWxpZGF0ZSA9IHZhbGlkYXRlICYmIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZC5mb3JtTm9WYWxpZGF0ZSAhPT0gdHJ1ZVxuICAgIH1cblxuICAgIC8vIGZvciBhIG5vbi1HRVQgaW5jbHVkZSB0aGUgY2xvc2VzdCBmb3JtXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIHByaW9yaXR5Rm9ybURhdGEsIGVycm9ycywgY2xvc2VzdChlbHQsICdmb3JtJyksIHZhbGlkYXRlKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKVxuXG4gICAgLy8gaWYgYSBidXR0b24gb3Igc3VibWl0IHdhcyBjbGlja2VkIGxhc3QsIGluY2x1ZGUgaXRzIHZhbHVlXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCBlbHQudGFnTmFtZSA9PT0gJ0JVVFRPTicgfHxcbiAgICAoZWx0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcpKSB7XG4gICAgICBjb25zdCBidXR0b24gPSBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgKC8qKiBAdHlwZSBIVE1MSW5wdXRFbGVtZW50fEhUTUxCdXR0b25FbGVtZW50ICovKGVsdCkpXG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGJ1dHRvbiwgJ25hbWUnKVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIGJ1dHRvbi52YWx1ZSwgcHJpb3JpdHlGb3JtRGF0YSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIGFueSBleHBsaWNpdCBpbmNsdWRlc1xuICAgIGNvbnN0IGluY2x1ZGVzID0gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5jbHVkZScpXG4gICAgZm9yRWFjaChpbmNsdWRlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBhc0VsZW1lbnQobm9kZSksIHZhbGlkYXRlKVxuICAgICAgLy8gaWYgYSBub24tZm9ybSBpcyBpbmNsdWRlZCwgaW5jbHVkZSBhbnkgaW5wdXQgdmFsdWVzIHdpdGhpbiBpdFxuICAgICAgaWYgKCFtYXRjaGVzKG5vZGUsICdmb3JtJykpIHtcbiAgICAgICAgZm9yRWFjaChhc1BhcmVudE5vZGUobm9kZSkucXVlcnlTZWxlY3RvckFsbChJTlBVVF9TRUxFQ1RPUiksIGZ1bmN0aW9uKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGRlc2NlbmRhbnQsIHZhbGlkYXRlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyB2YWx1ZXMgZnJvbSBhIDxmb3JtPiB0YWtlIHByZWNlZGVuY2UsIG92ZXJyaWRpbmcgdGhlIHJlZ3VsYXIgdmFsdWVzXG4gICAgb3ZlcnJpZGVGb3JtRGF0YShmb3JtRGF0YSwgcHJpb3JpdHlGb3JtRGF0YSlcblxuICAgIHJldHVybiB7IGVycm9ycywgZm9ybURhdGEsIHZhbHVlczogZm9ybURhdGFQcm94eShmb3JtRGF0YSkgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXR1cm5TdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHthbnl9IHJlYWxWYWx1ZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBuYW1lLCByZWFsVmFsdWUpIHtcbiAgICBpZiAocmV0dXJuU3RyICE9PSAnJykge1xuICAgICAgcmV0dXJuU3RyICs9ICcmJ1xuICAgIH1cbiAgICBpZiAoU3RyaW5nKHJlYWxWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZWFsVmFsdWUgPSBKU09OLnN0cmluZ2lmeShyZWFsVmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IHMgPSBlbmNvZGVVUklDb21wb25lbnQocmVhbFZhbHVlKVxuICAgIHJldHVyblN0ciArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBzXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF8T2JqZWN0fSB2YWx1ZXNcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBmdW5jdGlvbiB1cmxFbmNvZGUodmFsdWVzKSB7XG4gICAgdmFsdWVzID0gZm9ybURhdGFGcm9tT2JqZWN0KHZhbHVlcylcbiAgICBsZXQgcmV0dXJuU3RyID0gJydcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm5TdHIgPSBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBamF4XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9tcHRcbiAqIEByZXR1cm5zIHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHQpIHtcbiAgICAvKiogQHR5cGUgSHRteEhlYWRlclNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgJ0hYLVJlcXVlc3QnOiAndHJ1ZScsXG4gICAgICAnSFgtVHJpZ2dlcic6IGdldFJhd0F0dHJpYnV0ZShlbHQsICdpZCcpLFxuICAgICAgJ0hYLVRyaWdnZXItTmFtZSc6IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJyksXG4gICAgICAnSFgtVGFyZ2V0JzogZ2V0QXR0cmlidXRlVmFsdWUodGFyZ2V0LCAnaWQnKSxcbiAgICAgICdIWC1DdXJyZW50LVVSTCc6IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cbiAgICBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LWhlYWRlcnMnLCBmYWxzZSwgaGVhZGVycylcbiAgICBpZiAocHJvbXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLVByb21wdCddID0gcHJvbXB0XG4gICAgfVxuICAgIGlmIChnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Cb29zdGVkJ10gPSAndHJ1ZSdcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIC8qKlxuICogZmlsdGVyVmFsdWVzIHRha2VzIGFuIG9iamVjdCBjb250YWluaW5nIGZvcm0gaW5wdXQgdmFsdWVzXG4gKiBhbmQgcmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBvbmx5IGNvbnRhaW5zIGtleXMgdGhhdCBhcmVcbiAqIHNwZWNpZmllZCBieSB0aGUgY2xvc2VzdCBcImh4LXBhcmFtc1wiIGF0dHJpYnV0ZVxuICogQHBhcmFtIHtGb3JtRGF0YX0gaW5wdXRWYWx1ZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZmlsdGVyVmFsdWVzKGlucHV0VmFsdWVzLCBlbHQpIHtcbiAgICBjb25zdCBwYXJhbXNWYWx1ZSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wYXJhbXMnKVxuICAgIGlmIChwYXJhbXNWYWx1ZSkge1xuICAgICAgaWYgKHBhcmFtc1ZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlLmluZGV4T2YoJ25vdCAnKSA9PT0gMCkge1xuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnN1YnN0cig0KS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaW5wdXRWYWx1ZXMuZGVsZXRlKG5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaWYgKGlucHV0VmFsdWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZXMuZ2V0QWxsKG5hbWUpLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHsgbmV3VmFsdWVzLmFwcGVuZChuYW1lLCB2YWx1ZSkgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBuZXdWYWx1ZXNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0FuY2hvckxpbmsoZWx0KSB7XG4gICAgcmV0dXJuICEhZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSA+PSAwXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IFtzd2FwSW5mb092ZXJyaWRlXVxuICogQHJldHVybnMge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBJbmZvT3ZlcnJpZGUpIHtcbiAgICBjb25zdCBzd2FwSW5mbyA9IHN3YXBJbmZvT3ZlcnJpZGUgfHwgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN3YXAnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBzd2FwU3BlYyA9IHtcbiAgICAgIHN3YXBTdHlsZTogZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCA/ICdpbm5lckhUTUwnIDogaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSxcbiAgICAgIHN3YXBEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFN3YXBEZWxheSxcbiAgICAgIHNldHRsZURlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U2V0dGxlRGVsYXlcbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLnNjcm9sbEludG9WaWV3T25Cb29zdCAmJiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmICFpc0FuY2hvckxpbmsoZWx0KSkge1xuICAgICAgc3dhcFNwZWMuc2hvdyA9ICd0b3AnXG4gICAgfVxuICAgIGlmIChzd2FwSW5mbykge1xuICAgICAgY29uc3Qgc3BsaXQgPSBzcGxpdE9uV2hpdGVzcGFjZShzd2FwSW5mbylcbiAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNwbGl0W2ldXG4gICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ3N3YXA6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDUpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2V0dGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zZXR0bGVEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDcpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZigndHJhbnNpdGlvbjonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMudHJhbnNpdGlvbiA9IHZhbHVlLnN1YnN0cigxMSkgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignaWdub3JlVGl0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gdmFsdWUuc3Vic3RyKDEyKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFNwZWMgPSB2YWx1ZS5zdWJzdHIoNylcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzY3JvbGxTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsID0gc2Nyb2xsVmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGxUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2hvdzonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2hvd1NwZWMgPSB2YWx1ZS5zdWJzdHIoNSlcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzaG93U3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzaG93VmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93ID0gc2hvd1ZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvd1RhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdmb2N1cy1zY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzU2Nyb2xsVmFsID0gdmFsdWUuc3Vic3RyKCdmb2N1cy1zY3JvbGw6Jy5sZW5ndGgpXG4gICAgICAgICAgICBzd2FwU3BlYy5mb2N1c1Njcm9sbCA9IGZvY3VzU2Nyb2xsVmFsID09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwU3R5bGUgPSB2YWx1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dFcnJvcignVW5rbm93biBtb2RpZmllciBpbiBoeC1zd2FwOiAnICsgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3BlY1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB1c2VzRm9ybURhdGEoZWx0KSB7XG4gICAgcmV0dXJuIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1lbmNvZGluZycpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfHxcbiAgICAobWF0Y2hlcyhlbHQsICdmb3JtJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2VuY3R5cGUnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmaWx0ZXJlZFBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgeyp8c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZFBhcmFtZXRlcnMpIHtcbiAgICBsZXQgZW5jb2RlZFBhcmFtZXRlcnMgPSBudWxsXG4gICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyA9PSBudWxsKSB7XG4gICAgICAgIGVuY29kZWRQYXJhbWV0ZXJzID0gZXh0ZW5zaW9uLmVuY29kZVBhcmFtZXRlcnMoeGhyLCBmaWx0ZXJlZFBhcmFtZXRlcnMsIGVsdClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5jb2RlZFBhcmFtZXRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbnZlcnNpb24gdG8gYW4gYWN0dWFsIEZvcm1EYXRhIG9iamVjdCBpbiBjYXNlIGZpbHRlcmVkUGFyYW1ldGVycyBpcyBhIGZvcm1EYXRhUHJveHlcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14L2lzc3Vlcy8yMzE3XG4gICAgICAgIHJldHVybiBvdmVycmlkZUZvcm1EYXRhKG5ldyBGb3JtRGF0YSgpLCBmb3JtRGF0YUZyb21PYmplY3QoZmlsdGVyZWRQYXJhbWV0ZXJzKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmxFbmNvZGUoZmlsdGVyZWRQYXJhbWV0ZXJzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7SHRteFNldHRsZUluZm99XG4gKi9cbiAgZnVuY3Rpb24gbWFrZVNldHRsZUluZm8odGFyZ2V0KSB7XG4gICAgcmV0dXJuIHsgdGFza3M6IFtdLCBlbHRzOiBbdGFyZ2V0XSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxTdGF0ZShjb250ZW50LCBzd2FwU3BlYykge1xuICAgIGNvbnN0IGZpcnN0ID0gY29udGVudFswXVxuICAgIGNvbnN0IGxhc3QgPSBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV1cbiAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbFRhcmdldCkge1xuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gMFxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gdGFyZ2V0LnNjcm9sbEhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3dhcFNwZWMuc2hvdykge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0KSB7XG4gICAgICAgIGxldCB0YXJnZXRTdHIgPSBzd2FwU3BlYy5zaG93VGFyZ2V0XG4gICAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0ID09PSAnd2luZG93Jykge1xuICAgICAgICAgIHRhcmdldFN0ciA9ICdib2R5J1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCB0YXJnZXRTdHIpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBldmFsQXNEZWZhdWx0XG4gKiBAcGFyYW0ge09iamVjdD19IHZhbHVlc1xuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICB2YWx1ZXMgPSB7fVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZXNcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgICBsZXQgc3RyID0gYXR0cmlidXRlVmFsdWUudHJpbSgpXG4gICAgICBsZXQgZXZhbHVhdGVWYWx1ZSA9IGV2YWxBc0RlZmF1bHRcbiAgICAgIGlmIChzdHIgPT09ICd1bnNldCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDExKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdHIuaW5kZXhPZignanM6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigzKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCd7JykgIT09IDApIHtcbiAgICAgICAgc3RyID0gJ3snICsgc3RyICsgJ30nXG4gICAgICB9XG4gICAgICBsZXQgdmFyc1ZhbHVlc1xuICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkgeyByZXR1cm4gRnVuY3Rpb24oJ3JldHVybiAoJyArIHN0ciArICcpJykoKSB9LCB7fSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBwYXJzZUpTT04oc3RyKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFyc1ZhbHVlcykge1xuICAgICAgICBpZiAodmFyc1ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gdmFyc1ZhbHVlc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7KCkgPT4gYW55fSB0b0V2YWxcbiAgICogQHBhcmFtIHthbnk9fSBkZWZhdWx0VmFsXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUV2YWwoZWx0LCB0b0V2YWwsIGRlZmF1bHRWYWwpIHtcbiAgICBpZiAoaHRteC5jb25maWcuYWxsb3dFdmFsKSB7XG4gICAgICByZXR1cm4gdG9FdmFsKClcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpldmFsRGlzYWxsb3dlZEVycm9yJylcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFycycsIHRydWUsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFscycsIGZhbHNlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBnZXRFeHByZXNzaW9uVmFycyhlbHQpIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3RzKGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0KSwgZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGhlYWRlclZhbHVlXG4gICAqL1xuICBmdW5jdGlvbiBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpIHtcbiAgICBpZiAoaGVhZGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBPbiBhbiBleGNlcHRpb24sIHRyeSB0byBzZXQgdGhlIGhlYWRlciBVUkkgZW5jb2RlZCBpbnN0ZWFkXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgZW5jb2RlVVJJQ29tcG9uZW50KGhlYWRlclZhbHVlKSlcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyICsgJy1VUkktQXV0b0VuY29kZWQnLCAndHJ1ZScpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocikge1xuICAvLyBOQjogSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgc3R1ZmZcbiAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICYmIHR5cGVvZiAoVVJMKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoeGhyLnJlc3BvbnNlVVJMKVxuICAgICAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJhZFJlc3BvbnNlVXJsJywgeyB1cmw6IHhoci5yZXNwb25zZVVSTCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzSGVhZGVyKHhociwgcmVnZXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cC50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZXMgYW4gaHRteC1zdHlsZSBBSkFYIHJlcXVlc3RcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWpheFxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBVUkwgcGF0aCB0byBtYWtlIHRoZSBBSkFYXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd8SHRteEFqYXhIZWxwZXJDb250ZXh0fSBjb250ZXh0IHRoZSBlbGVtZW50IHRvIHRhcmdldCAoZGVmYXVsdHMgdG8gdGhlICoqYm9keSoqKSB8IGEgc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgfCBhIGNvbnRleHQgb2JqZWN0IHRoYXQgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmdcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5IGlmIG5vIHJlcXVlc3QgaXMgc2VudCwgb3Igd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgZnVuY3Rpb24gYWpheEhlbHBlcih2ZXJiLCBwYXRoLCBjb250ZXh0KSB7XG4gICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8odmVyYi50b0xvd2VyQ2FzZSgpKSlcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dCksXG4gICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgcmVzb2x2ZVRhcmdldChjb250ZXh0LnNvdXJjZSksIGNvbnRleHQuZXZlbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGFuZGxlcjogY29udGV4dC5oYW5kbGVyLFxuICAgICAgICAgICAgaGVhZGVyczogY29udGV4dC5oZWFkZXJzLFxuICAgICAgICAgICAgdmFsdWVzOiBjb250ZXh0LnZhbHVlcyxcbiAgICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQudGFyZ2V0KSxcbiAgICAgICAgICAgIHN3YXBPdmVycmlkZTogY29udGV4dC5zd2FwLFxuICAgICAgICAgICAgc2VsZWN0OiBjb250ZXh0LnNlbGVjdCxcbiAgICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGhpZXJhcmNoeUZvckVsdChlbHQpIHtcbiAgICBjb25zdCBhcnIgPSBbXVxuICAgIHdoaWxlIChlbHQpIHtcbiAgICAgIGFyci5wdXNoKGVsdClcbiAgICAgIGVsdCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB2ZXJpZnlQYXRoKGVsdCwgcGF0aCwgcmVxdWVzdENvbmZpZykge1xuICAgIGxldCBzYW1lSG9zdFxuICAgIGxldCB1cmxcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXJsID0gbmV3IFVSTChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKVxuICAgICAgY29uc3Qgb3JpZ2luID0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgICBzYW1lSG9zdCA9IG9yaWdpbiA9PT0gdXJsLm9yaWdpblxuICAgIH0gZWxzZSB7XG4gICAgLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgVVJMXG4gICAgICB1cmwgPSBwYXRoXG4gICAgICBzYW1lSG9zdCA9IHN0YXJ0c1dpdGgocGF0aCwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5zZWxmUmVxdWVzdHNPbmx5KSB7XG4gICAgICBpZiAoIXNhbWVIb3N0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGVVcmwnLCBtZXJnZU9iamVjdHMoeyB1cmwsIHNhbWVIb3N0IH0sIHJlcXVlc3RDb25maWcpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZvcm1EYXRhfSBvYmpcbiAgICogQHJldHVybiB7Rm9ybURhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvcm1EYXRhKSByZXR1cm4gb2JqXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0uZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9ialtrZXldLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgIShvYmpba2V5XSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgSlNPTi5zdHJpbmdpZnkob2JqW2tleV0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhQXJyYXlQcm94eShmb3JtRGF0YSwgbmFtZSwgYXJyYXkpIHtcbiAgICAvLyBtdXRhdGluZyB0aGUgYXJyYXkgc2hvdWxkIG11dGF0ZSB0aGUgdW5kZXJseWluZyBmb3JtIGRhdGFcbiAgICByZXR1cm4gbmV3IFByb3h5KGFycmF5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIGlmIChrZXkgPT09ICdsZW5ndGgnKSByZXR1cm4gdGFyZ2V0Lmxlbmd0aFxuICAgICAgICBpZiAoa2V5ID09PSAncHVzaCcpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpXG4gICAgICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldFtrZXldICYmIHRhcmdldFtrZXldLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFQcm94eShmb3JtRGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZm9ybURhdGEsIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHN5bWJvbCBjYWxscyB0byB0aGUgRm9ybURhdGEgaXRzZWxmIGRpcmVjdGx5XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgbmFtZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ3RvSlNPTicpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IEpTT04uc3RyaW5naWZ5IGNhbGwgb24gcHJveHlcbiAgICAgICAgICByZXR1cm4gKCkgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lIGluIHRhcmdldCkge1xuICAgICAgICAgIC8vIFdyYXAgaW4gZnVuY3Rpb24gd2l0aCBhcHBseSB0byBjb3JyZWN0bHkgYmluZCB0aGUgRm9ybURhdGEgY29udGV4dCwgYXMgYSBkaXJlY3QgY2FsbCB3b3VsZCByZXN1bHQgaW4gYW4gaWxsZWdhbCBpbnZvY2F0aW9uIGVycm9yXG4gICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcm1EYXRhW25hbWVdLmFwcGx5KGZvcm1EYXRhLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXkgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgICAgLy8gVGhvc2UgMiB1bmRlZmluZWQgJiBzaW5nbGUgdmFsdWUgcmV0dXJucyBhcmUgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkgYXMgd2Ugd2VyZW4ndCB1c2luZyBGb3JtRGF0YSBiZWZvcmVcbiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gYXJyYXlbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZm9ybURhdGFBcnJheVByb3h5KHRhcmdldCwgbmFtZSwgYXJyYXkpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IHRhcmdldC5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEodmFsdWUgaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICAvLyBTdXBwb3J0IE9iamVjdC5hc3NpZ24gY2FsbCBmcm9tIHByb3h5XG4gICAgICBvd25LZXlzOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSlcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRhcmdldCwgcHJvcCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCksIHByb3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7SHRteEFqYXhFdGN9IFtldGNdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmZpcm1lZF1cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCBjb25maXJtZWQpIHtcbiAgICBsZXQgcmVzb2x2ZSA9IG51bGxcbiAgICBsZXQgcmVqZWN0ID0gbnVsbFxuICAgIGV0YyA9IGV0YyAhPSBudWxsID8gZXRjIDoge31cbiAgICBpZiAoZXRjLnJldHVyblByb21pc2UgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICByZWplY3QgPSBfcmVqZWN0XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIGVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZUhhbmRsZXIgPSBldGMuaGFuZGxlciB8fCBoYW5kbGVBamF4UmVzcG9uc2VcbiAgICBjb25zdCBzZWxlY3QgPSBldGMuc2VsZWN0IHx8IG51bGxcblxuICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAvLyBkbyBub3QgaXNzdWUgcmVxdWVzdHMgZm9yIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV0Yy50YXJnZXRPdmVycmlkZSB8fCBhc0VsZW1lbnQoZ2V0VGFyZ2V0KGVsdCkpXG4gICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IHRhcmdldCA9PSBEVU1NWV9FTFQpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGFyZ2V0RXJyb3InLCB7IHRhcmdldDogZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JykgfSlcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGxldCBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBjb25zdCBzdWJtaXR0ZXIgPSBlbHREYXRhLmxhc3RCdXR0b25DbGlja2VkXG5cbiAgICBpZiAoc3VibWl0dGVyKSB7XG4gICAgICBjb25zdCBidXR0b25QYXRoID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1hY3Rpb24nKVxuICAgICAgaWYgKGJ1dHRvblBhdGggIT0gbnVsbCkge1xuICAgICAgICBwYXRoID0gYnV0dG9uUGF0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25WZXJiID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1tZXRob2QnKVxuICAgICAgaWYgKGJ1dHRvblZlcmIgIT0gbnVsbCkge1xuICAgICAgLy8gaWdub3JlIGJ1dHRvbnMgd2l0aCBmb3JtbWV0aG9kPVwiZGlhbG9nXCJcbiAgICAgICAgaWYgKGJ1dHRvblZlcmIudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyhidXR0b25WZXJiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm1RdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1jb25maXJtJylcbiAgICAvLyBhbGxvdyBldmVudC1iYXNlZCBjb25maXJtYXRpb24gdy8gYSBjYWxsYmFja1xuICAgIGlmIChjb25maXJtZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNzdWVSZXF1ZXN0ID0gZnVuY3Rpb24oc2tpcENvbmZpcm1hdGlvbikge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsICEhc2tpcENvbmZpcm1hdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpcm1EZXRhaWxzID0geyB0YXJnZXQsIGVsdCwgcGF0aCwgdmVyYiwgdHJpZ2dlcmluZ0V2ZW50OiBldmVudCwgZXRjLCBpc3N1ZVJlcXVlc3QsIHF1ZXN0aW9uOiBjb25maXJtUXVlc3Rpb24gfVxuICAgICAgaWYgKHRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpcm0nLCBjb25maXJtRGV0YWlscykgPT09IGZhbHNlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzeW5jRWx0ID0gZWx0XG4gICAgbGV0IHN5bmNTdHJhdGVneSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zeW5jJylcbiAgICBsZXQgcXVldWVTdHJhdGVneSA9IG51bGxcbiAgICBsZXQgYWJvcnRhYmxlID0gZmFsc2VcbiAgICBpZiAoc3luY1N0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBzeW5jU3RyaW5ncyA9IHN5bmNTdHJhdGVneS5zcGxpdCgnOicpXG4gICAgICBjb25zdCBzZWxlY3RvciA9IHN5bmNTdHJpbmdzWzBdLnRyaW0oKVxuICAgICAgaWYgKHNlbGVjdG9yID09PSAndGhpcycpIHtcbiAgICAgICAgc3luY0VsdCA9IGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC1zeW5jJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN5bmNFbHQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHNlbGVjdG9yKSlcbiAgICAgIH1cbiAgICAgIC8vIGRlZmF1bHQgdG8gdGhlIGRyb3Agc3RyYXRlZ3lcbiAgICAgIHN5bmNTdHJhdGVneSA9IChzeW5jU3RyaW5nc1sxXSB8fCAnZHJvcCcpLnRyaW0oKVxuICAgICAgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShzeW5jRWx0KVxuICAgICAgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Ryb3AnICYmIGVsdERhdGEueGhyICYmIGVsdERhdGEuYWJvcnRhYmxlICE9PSB0cnVlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdhYm9ydCcpIHtcbiAgICAgICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhYm9ydGFibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAncmVwbGFjZScpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5LmluZGV4T2YoJ3F1ZXVlJykgPT09IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVTdHJBcnJheSA9IHN5bmNTdHJhdGVneS5zcGxpdCgnICcpXG4gICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAocXVldWVTdHJBcnJheVsxXSB8fCAnbGFzdCcpLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgaWYgKGVsdERhdGEuYWJvcnRhYmxlKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZlbnQpXG4gICAgICAgICAgICBpZiAoZXZlbnREYXRhICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyAmJiBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWUpIHtcbiAgICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9IGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gJ2xhc3QnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID09IG51bGwpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2ZpcnN0JyAmJiBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdsYXN0Jykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXSAvLyBkdW1wIGV4aXN0aW5nIHF1ZXVlXG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGVsdERhdGEueGhyID0geGhyXG4gICAgZWx0RGF0YS5hYm9ydGFibGUgPSBhYm9ydGFibGVcbiAgICBjb25zdCBlbmRSZXF1ZXN0TG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWx0RGF0YS54aHIgPSBudWxsXG4gICAgICBlbHREYXRhLmFib3J0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyAhPSBudWxsICYmXG4gICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVkUmVxdWVzdCA9IGVsdERhdGEucXVldWVkUmVxdWVzdHMuc2hpZnQoKVxuICAgICAgICBxdWV1ZWRSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvbXB0UXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHJvbXB0JylcbiAgICBpZiAocHJvbXB0UXVlc3Rpb24pIHtcbiAgICAgIHZhciBwcm9tcHRSZXNwb25zZSA9IHByb21wdChwcm9tcHRRdWVzdGlvbilcbiAgICAgIC8vIHByb21wdCByZXR1cm5zIG51bGwgaWYgY2FuY2VsbGVkIGFuZCBlbXB0eSBzdHJpbmcgaWYgYWNjZXB0ZWQgd2l0aCBubyBlbnRyeVxuICAgICAgaWYgKHByb21wdFJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgICAhdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cHJvbXB0JywgeyBwcm9tcHQ6IHByb21wdFJlc3BvbnNlLCB0YXJnZXQgfSkpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybVF1ZXN0aW9uICYmICFjb25maXJtZWQpIHtcbiAgICAgIGlmICghY29uZmlybShjb25maXJtUXVlc3Rpb24pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHRSZXNwb25zZSlcblxuICAgIGlmICh2ZXJiICE9PSAnZ2V0JyAmJiAhdXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICB9XG5cbiAgICBpZiAoZXRjLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMgPSBtZXJnZU9iamVjdHMoaGVhZGVycywgZXRjLmhlYWRlcnMpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpXG4gICAgbGV0IGVycm9ycyA9IHJlc3VsdHMuZXJyb3JzXG4gICAgY29uc3QgcmF3Rm9ybURhdGEgPSByZXN1bHRzLmZvcm1EYXRhXG4gICAgaWYgKGV0Yy52YWx1ZXMpIHtcbiAgICAgIG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGZvcm1EYXRhRnJvbU9iamVjdChldGMudmFsdWVzKSlcbiAgICB9XG4gICAgY29uc3QgZXhwcmVzc2lvblZhcnMgPSBmb3JtRGF0YUZyb21PYmplY3QoZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSlcbiAgICBjb25zdCBhbGxGb3JtRGF0YSA9IG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGV4cHJlc3Npb25WYXJzKVxuICAgIGxldCBmaWx0ZXJlZEZvcm1EYXRhID0gZmlsdGVyVmFsdWVzKGFsbEZvcm1EYXRhLCBlbHQpXG5cbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSAmJiB2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgZmlsdGVyZWRGb3JtRGF0YS5zZXQoJ29yZy5odG14LmNhY2hlLWJ1c3RlcicsIGdldFJhd0F0dHJpYnV0ZSh0YXJnZXQsICdpZCcpIHx8ICd0cnVlJylcbiAgICB9XG5cbiAgICAvLyBiZWhhdmlvciBvZiBhbmNob3JzIHcvIGVtcHR5IGhyZWYgaXMgdG8gdXNlIHRoZSBjdXJyZW50IFVSTFxuICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aCA9PT0gJycpIHtcbiAgICAgIHBhdGggPSBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtub0hlYWRlcnNdXG4gICAgICovXG4gICAgY29uc3QgcmVxdWVzdEF0dHJWYWx1ZXMgPSBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXJlcXVlc3QnKVxuXG4gICAgY29uc3QgZWx0SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHVzZVVybFBhcmFtcyA9IGh0bXguY29uZmlnLm1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zLmluZGV4T2YodmVyYikgPj0gMFxuXG4gICAgLyoqIEB0eXBlIEh0bXhSZXF1ZXN0Q29uZmlnICovXG4gICAgY29uc3QgcmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHVzZVVybFBhcmFtcyxcbiAgICAgIGZvcm1EYXRhOiBmaWx0ZXJlZEZvcm1EYXRhLFxuICAgICAgcGFyYW1ldGVyczogZm9ybURhdGFQcm94eShmaWx0ZXJlZEZvcm1EYXRhKSxcbiAgICAgIHVuZmlsdGVyZWRGb3JtRGF0YTogYWxsRm9ybURhdGEsXG4gICAgICB1bmZpbHRlcmVkUGFyYW1ldGVyczogZm9ybURhdGFQcm94eShhbGxGb3JtRGF0YSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdmVyYixcbiAgICAgIGVycm9ycyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogZXRjLmNyZWRlbnRpYWxzIHx8IHJlcXVlc3RBdHRyVmFsdWVzLmNyZWRlbnRpYWxzIHx8IGh0bXguY29uZmlnLndpdGhDcmVkZW50aWFscyxcbiAgICAgIHRpbWVvdXQ6IGV0Yy50aW1lb3V0IHx8IHJlcXVlc3RBdHRyVmFsdWVzLnRpbWVvdXQgfHwgaHRteC5jb25maWcudGltZW91dCxcbiAgICAgIHBhdGgsXG4gICAgICB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50XG4gICAgfVxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maWdSZXF1ZXN0JywgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICAvLyBjb3B5IG91dCBpbiBjYXNlIHRoZSBvYmplY3Qgd2FzIG92ZXJ3cml0dGVuXG4gICAgcGF0aCA9IHJlcXVlc3RDb25maWcucGF0aFxuICAgIHZlcmIgPSByZXF1ZXN0Q29uZmlnLnZlcmJcbiAgICBoZWFkZXJzID0gcmVxdWVzdENvbmZpZy5oZWFkZXJzXG4gICAgZmlsdGVyZWRGb3JtRGF0YSA9IGZvcm1EYXRhRnJvbU9iamVjdChyZXF1ZXN0Q29uZmlnLnBhcmFtZXRlcnMpXG4gICAgZXJyb3JzID0gcmVxdWVzdENvbmZpZy5lcnJvcnNcbiAgICB1c2VVcmxQYXJhbXMgPSByZXF1ZXN0Q29uZmlnLnVzZVVybFBhcmFtc1xuXG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGlvbjpoYWx0ZWQnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0UGF0aCA9IHBhdGguc3BsaXQoJyMnKVxuICAgIGNvbnN0IHBhdGhOb0FuY2hvciA9IHNwbGl0UGF0aFswXVxuICAgIGNvbnN0IGFuY2hvciA9IHNwbGl0UGF0aFsxXVxuXG4gICAgbGV0IGZpbmFsUGF0aCA9IHBhdGhcbiAgICBpZiAodXNlVXJsUGFyYW1zKSB7XG4gICAgICBmaW5hbFBhdGggPSBwYXRoTm9BbmNob3JcbiAgICAgIGNvbnN0IGhhc1ZhbHVlcyA9ICFmaWx0ZXJlZEZvcm1EYXRhLmtleXMoKS5uZXh0KCkuZG9uZVxuICAgICAgaWYgKGhhc1ZhbHVlcykge1xuICAgICAgICBpZiAoZmluYWxQYXRoLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJz8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcmJ1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsUGF0aCArPSB1cmxFbmNvZGUoZmlsdGVyZWRGb3JtRGF0YSlcbiAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnIycgKyBhbmNob3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdmVyaWZ5UGF0aChlbHQsIGZpbmFsUGF0aCwgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6aW52YWxpZFBhdGgnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgeGhyLm9wZW4odmVyYi50b1VwcGVyQ2FzZSgpLCBmaW5hbFBhdGgsIHRydWUpXG4gICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvaHRtbCcpXG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHJlcXVlc3RDb25maWcud2l0aENyZWRlbnRpYWxzXG4gICAgeGhyLnRpbWVvdXQgPSByZXF1ZXN0Q29uZmlnLnRpbWVvdXRcblxuICAgIC8vIHJlcXVlc3QgaGVhZGVyc1xuICAgIGlmIChyZXF1ZXN0QXR0clZhbHVlcy5ub0hlYWRlcnMpIHtcbiAgICAvLyBpZ25vcmUgYWxsIGhlYWRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlcl1cbiAgICAgICAgICBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0h0bXhSZXNwb25zZUluZm99ICovXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvID0ge1xuICAgICAgeGhyLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcmVxdWVzdENvbmZpZyxcbiAgICAgIGV0YyxcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHNlbGVjdCxcbiAgICAgIHBhdGhJbmZvOiB7XG4gICAgICAgIHJlcXVlc3RQYXRoOiBwYXRoLFxuICAgICAgICBmaW5hbFJlcXVlc3RQYXRoOiBmaW5hbFBhdGgsXG4gICAgICAgIHJlc3BvbnNlUGF0aDogbnVsbCxcbiAgICAgICAgYW5jaG9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGllcmFyY2h5ID0gaGllcmFyY2h5Rm9yRWx0KGVsdClcbiAgICAgICAgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aCA9IGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKVxuICAgICAgICByZXNwb25zZUhhbmRsZXIoZWx0LCByZXNwb25zZUluZm8pXG4gICAgICAgIGlmIChyZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgIT09IHRydWUpIHtcbiAgICAgICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAvLyBpZiB0aGUgYm9keSBubyBsb25nZXIgY29udGFpbnMgdGhlIGVsZW1lbnQsIHRyaWdnZXIgdGhlIGV2ZW50IG9uIHRoZSBjbG9zZXN0IHBhcmVudFxuICAgICAgICAvLyByZW1haW5pbmcgaW4gdGhlIERPTVxuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgbGV0IHNlY29uZGFyeVRyaWdnZXJFbHQgPSBudWxsXG4gICAgICAgICAgd2hpbGUgKGhpZXJhcmNoeS5sZW5ndGggPiAwICYmIHNlY29uZGFyeVRyaWdnZXJFbHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50RWx0SW5IaWVyYXJjaHkgPSBoaWVyYXJjaHkuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKGJvZHlDb250YWlucyhwYXJlbnRFbHRJbkhpZXJhcmNoeSkpIHtcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IHBhcmVudEVsdEluSGllcmFyY2h5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWNvbmRhcnlUcmlnZ2VyRWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14Om9uTG9hZEVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgdGhyb3cgZVxuICAgICAgfVxuICAgIH1cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRBYm9ydCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRpbWVvdXQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVJlcXVlc3QnLCByZXNwb25zZUluZm8pKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIHZhciBpbmRpY2F0b3JzID0gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KVxuICAgIHZhciBkaXNhYmxlRWx0cyA9IGRpc2FibGVFbGVtZW50cyhlbHQpXG5cbiAgICBmb3JFYWNoKFsnbG9hZHN0YXJ0JywgJ2xvYWRlbmQnLCAncHJvZ3Jlc3MnLCAnYWJvcnQnXSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBmb3JFYWNoKFt4aHIsIHhoci51cGxvYWRdLCBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnhocjonICsgZXZlbnROYW1lLCB7XG4gICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudC5sZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogZXZlbnQudG90YWxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVNlbmQnLCByZXNwb25zZUluZm8pXG4gICAgY29uc3QgcGFyYW1zID0gdXNlVXJsUGFyYW1zID8gbnVsbCA6IGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkRm9ybURhdGEpXG4gICAgeGhyLnNlbmQocGFyYW1zKVxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlVcGRhdGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3R5cGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFtwYXRoXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICogQHJldHVybiB7SHRteEhpc3RvcnlVcGRhdGV9XG4gICAqL1xuICBmdW5jdGlvbiBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBGaXJzdCBjb25zdWx0IHJlc3BvbnNlIGhlYWRlcnNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IHBhdGhGcm9tSGVhZGVycyA9IG51bGxcbiAgICBsZXQgdHlwZUZyb21IZWFkZXJzID0gbnVsbFxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaC1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVwbGFjZS1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlcGxhY2UtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdyZXBsYWNlJ1xuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIHdhcyBhIHJlc3BvbnNlIGhlYWRlciwgdGhhdCBoYXMgcHJpb3JpdHlcbiAgICBpZiAocGF0aEZyb21IZWFkZXJzKSB7XG4gICAgICBpZiAocGF0aEZyb21IZWFkZXJzID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0eXBlRnJvbUhlYWRlcnMsXG4gICAgICAgICAgcGF0aDogcGF0aEZyb21IZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTmV4dCByZXNvbHZlIHZpYSBET00gdmFsdWVzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmZpbmFsUmVxdWVzdFBhdGhcbiAgICBjb25zdCByZXNwb25zZVBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoXG5cbiAgICBjb25zdCBwdXNoVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXB1c2gtdXJsJylcbiAgICBjb25zdCByZXBsYWNlVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXJlcGxhY2UtdXJsJylcbiAgICBjb25zdCBlbGVtZW50SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHNhdmVUeXBlID0gbnVsbFxuICAgIGxldCBwYXRoID0gbnVsbFxuXG4gICAgaWYgKHB1c2hVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcHVzaFVybFxuICAgIH0gZWxzZSBpZiAocmVwbGFjZVVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncmVwbGFjZSdcbiAgICAgIHBhdGggPSByZXBsYWNlVXJsXG4gICAgfSBlbHNlIGlmIChlbGVtZW50SXNCb29zdGVkKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgIC8vIGZhbHNlIGluZGljYXRlcyBubyBwdXNoLCByZXR1cm4gZW1wdHkgb2JqZWN0XG4gICAgICBpZiAocGF0aCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgLy8gdHJ1ZSBpbmRpY2F0ZXMgd2Ugd2FudCB0byBmb2xsb3cgd2hlcmV2ZXIgdGhlIHNlcnZlciBlbmRlZCB1cCBzZW5kaW5nIHVzXG4gICAgICBpZiAocGF0aCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgICB9XG5cbiAgICAgIC8vIHJlc3RvcmUgYW55IGFuY2hvciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RcbiAgICAgIGlmIChyZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yICYmIHBhdGguaW5kZXhPZignIycpID09PSAtMSkge1xuICAgICAgICBwYXRoID0gcGF0aCArICcjJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogc2F2ZVR5cGUsXG4gICAgICAgIHBhdGhcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9IHJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0NvbmZpZywgc3RhdHVzKSB7XG4gICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVzcG9uc2VIYW5kbGluZ0NvbmZpZy5jb2RlKVxuICAgIHJldHVybiByZWdFeHAudGVzdChzdGF0dXMudG9TdHJpbmcoMTApKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ31cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnICovXG4gICAgICB2YXIgcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQgPSBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nW2ldXG4gICAgICBpZiAoY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQsIHhoci5zdGF0dXMpKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUhhbmRsaW5nRWxlbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBubyBtYXRjaGVzLCByZXR1cm4gbm8gc3dhcFxuICAgIHJldHVybiB7XG4gICAgICBzd2FwOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRpdGxlKHRpdGxlKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBjb25zdCB0aXRsZUVsdCA9IGZpbmQoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsdCkge1xuICAgICAgICB0aXRsZUVsdC5pbm5lckhUTUwgPSB0aXRsZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnRpdGxlID0gdGl0bGVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUFqYXhSZXNwb25zZShlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcbiAgICBsZXQgdGFyZ2V0ID0gcmVzcG9uc2VJbmZvLnRhcmdldFxuICAgIGNvbnN0IGV0YyA9IHJlc3BvbnNlSW5mby5ldGNcbiAgICBjb25zdCByZXNwb25zZUluZm9TZWxlY3QgPSByZXNwb25zZUluZm8uc2VsZWN0XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZU9uTG9hZCcsIHJlc3BvbnNlSW5mbykpIHJldHVyblxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyOi9pKSkge1xuICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyJywgZWx0KVxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtTG9jYXRpb246L2kpKSB7XG4gICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgbGV0IHJlZGlyZWN0UGF0aCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtTG9jYXRpb24nKVxuICAgICAgLyoqIEB0eXBlIHtIdG14QWpheEhlbHBlckNvbnRleHQme3BhdGg6c3RyaW5nfX0gKi9cbiAgICAgIHZhciByZWRpcmVjdFN3YXBTcGVjXG4gICAgICBpZiAocmVkaXJlY3RQYXRoLmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgICByZWRpcmVjdFN3YXBTcGVjID0gcGFyc2VKU09OKHJlZGlyZWN0UGF0aClcbiAgICAgICAgLy8gd2hhdCdzIHRoZSBiZXN0IHdheSB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdXNlciBkaWRuJ3QgaW5jbHVkZSB0aGlzXG4gICAgICAgIHJlZGlyZWN0UGF0aCA9IHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgICBkZWxldGUgcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICB9XG4gICAgICBhamF4SGVscGVyKCdnZXQnLCByZWRpcmVjdFBhdGgsIHJlZGlyZWN0U3dhcFNwZWMpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShyZWRpcmVjdFBhdGgpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUmVmcmVzaCA9IGhhc0hlYWRlcih4aHIsIC9IWC1SZWZyZXNoOi9pKSAmJiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZnJlc2gnKSA9PT0gJ3RydWUnXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlZGlyZWN0Oi9pKSkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24uaHJlZiA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVkaXJlY3QnKVxuICAgICAgc2hvdWxkUmVmcmVzaCAmJiBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlZnJlc2gpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGlzdG9yeVVwZGF0ZSA9IGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKVxuXG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGluZyA9IHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocilcbiAgICBjb25zdCBzaG91bGRTd2FwID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwXG4gICAgbGV0IGlzRXJyb3IgPSAhIXJlc3BvbnNlSGFuZGxpbmcuZXJyb3JcbiAgICBsZXQgaWdub3JlVGl0bGUgPSBodG14LmNvbmZpZy5pZ25vcmVUaXRsZSB8fCByZXNwb25zZUhhbmRsaW5nLmlnbm9yZVRpdGxlXG4gICAgbGV0IHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zZWxlY3RcbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy50YXJnZXQpIHtcbiAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSlcbiAgICB9XG4gICAgdmFyIHN3YXBPdmVycmlkZSA9IGV0Yy5zd2FwT3ZlcnJpZGVcbiAgICBpZiAoc3dhcE92ZXJyaWRlID09IG51bGwgJiYgcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGUpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlXG4gICAgfVxuXG4gICAgLy8gcmVzcG9uc2UgaGVhZGVycyBvdmVycmlkZSByZXNwb25zZSBoYW5kbGluZyBjb25maWdcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgIH1cblxuICAgIHZhciBzZXJ2ZXJSZXNwb25zZSA9IHhoci5yZXNwb25zZVxuICAgIC8qKiBAdHlwZSBIdG14QmVmb3JlU3dhcERldGFpbHMgKi9cbiAgICB2YXIgYmVmb3JlU3dhcERldGFpbHMgPSBtZXJnZU9iamVjdHMoe1xuICAgICAgc2hvdWxkU3dhcCxcbiAgICAgIHNlcnZlclJlc3BvbnNlLFxuICAgICAgaXNFcnJvcixcbiAgICAgIGlnbm9yZVRpdGxlLFxuICAgICAgc2VsZWN0T3ZlcnJpZGVcbiAgICB9LCByZXNwb25zZUluZm8pXG5cbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy5ldmVudCAmJiAhdHJpZ2dlckV2ZW50KHRhcmdldCwgcmVzcG9uc2VIYW5kbGluZy5ldmVudCwgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6YmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgc2VydmVyUmVzcG9uc2UgPSBiZWZvcmVTd2FwRGV0YWlscy5zZXJ2ZXJSZXNwb25zZSAvLyBhbGxvdyB1cGRhdGluZyBjb250ZW50XG4gICAgaXNFcnJvciA9IGJlZm9yZVN3YXBEZXRhaWxzLmlzRXJyb3IgLy8gYWxsb3cgdXBkYXRpbmcgZXJyb3JcbiAgICBpZ25vcmVUaXRsZSA9IGJlZm9yZVN3YXBEZXRhaWxzLmlnbm9yZVRpdGxlIC8vIGFsbG93IHVwZGF0aW5nIGlnbm9yaW5nIHRpdGxlXG4gICAgc2VsZWN0T3ZlcnJpZGUgPSBiZWZvcmVTd2FwRGV0YWlscy5zZWxlY3RPdmVycmlkZSAvLyBhbGxvdyB1cGRhdGluZyBzZWxlY3Qgb3ZlcnJpZGVcblxuICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSB0YXJnZXQgLy8gTWFrZSB1cGRhdGVkIHRhcmdldCBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLmZhaWxlZCA9IGlzRXJyb3IgLy8gTWFrZSBmYWlsZWQgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5zdWNjZXNzZnVsID0gIWlzRXJyb3IgLy8gTWFrZSBzdWNjZXNzZnVsIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcblxuICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjg2KSB7XG4gICAgICAgIGNhbmNlbFBvbGxpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IGV4dGVuc2lvbi50cmFuc2Zvcm1SZXNwb25zZShzZXJ2ZXJSZXNwb25zZSwgeGhyLCBlbHQpXG4gICAgICB9KVxuXG4gICAgICAvLyBTYXZlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSB3aWxsIGJlIGEgaGlzdG9yeSB1cGRhdGVcbiAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICAgIH1cbiAgICAgIHZhciBzd2FwU3BlYyA9IGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcE92ZXJyaWRlKVxuXG4gICAgICBpZiAoIXN3YXBTcGVjLmhhc093blByb3BlcnR5KCdpZ25vcmVUaXRsZScpKSB7XG4gICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gaWdub3JlVGl0bGVcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcblxuICAgICAgLy8gb3B0aW9uYWwgdHJhbnNpdGlvbiBBUEkgcHJvbWlzZSBjYWxsYmFja3NcbiAgICAgIGxldCBzZXR0bGVSZXNvbHZlID0gbnVsbFxuICAgICAgbGV0IHNldHRsZVJlamVjdCA9IG51bGxcblxuICAgICAgaWYgKHJlc3BvbnNlSW5mb1NlbGVjdCkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSW5mb1NlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc2VsZWN0Oi9pKSkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzZWxlY3QnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3RPT0IgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0LW9vYicpXG4gICAgICBjb25zdCBzZWxlY3QgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0JylcblxuICAgICAgbGV0IGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGlmIHdlIG5lZWQgdG8gc2F2ZSBoaXN0b3J5LCBkbyBzbywgYmVmb3JlIHN3YXBwaW5nIHNvIHRoYXQgcmVsYXRpdmUgcmVzb3VyY2VzIGhhdmUgdGhlIGNvcnJlY3QgYmFzZSBVUkxcbiAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5VXBkYXRlJywgbWVyZ2VPYmplY3RzKHsgaGlzdG9yeTogaGlzdG9yeVVwZGF0ZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnB1c2hlZEludG9IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VVcmxJbkhpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpyZXBsYWNlZEluSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dhcCh0YXJnZXQsIHNlcnZlclJlc3BvbnNlLCBzd2FwU3BlYywge1xuICAgICAgICAgICAgc2VsZWN0OiBzZWxlY3RPdmVycmlkZSB8fCBzZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3RPT0IsXG4gICAgICAgICAgICBldmVudEluZm86IHJlc3BvbnNlSW5mbyxcbiAgICAgICAgICAgIGFuY2hvcjogcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvcixcbiAgICAgICAgICAgIGNvbnRleHRFbGVtZW50OiBlbHQsXG4gICAgICAgICAgICBhZnRlclN3YXBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1Td2FwOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1Td2FwJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlclNldHRsZUNhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVNldHRsZTovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlc29sdmUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3dhcEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZWplY3QpXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBzaG91bGRUcmFuc2l0aW9uID0gaHRteC5jb25maWcuZ2xvYmFsVmlld1RyYW5zaXRpb25zXG4gICAgICBpZiAoc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ3RyYW5zaXRpb24nKSkge1xuICAgICAgICBzaG91bGRUcmFuc2l0aW9uID0gc3dhcFNwZWMudHJhbnNpdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVUcmFuc2l0aW9uJywgcmVzcG9uc2VJbmZvKSAmJlxuICAgICAgICAgICAgICB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBjb25zdCBzZXR0bGVQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgICBzZXR0bGVSZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgICBzZXR0bGVSZWplY3QgPSBfcmVqZWN0XG4gICAgICAgIH0pXG4gICAgICAgIC8vIHdyYXAgdGhlIG9yaWdpbmFsIGRvU3dhcCgpIGluIGEgY2FsbCB0byBzdGFydFZpZXdUcmFuc2l0aW9uKClcbiAgICAgICAgY29uc3QgaW5uZXJEb1N3YXAgPSBkb1N3YXBcbiAgICAgICAgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5uZXJEb1N3YXAoKVxuICAgICAgICAgICAgcmV0dXJuIHNldHRsZVByb21pc2VcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzd2FwU3BlYy5zd2FwRGVsYXkgPiAwKSB7XG4gICAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9Td2FwLCBzd2FwU3BlYy5zd2FwRGVsYXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1N3YXAoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNFcnJvcikge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpyZXNwb25zZUVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6ICdSZXNwb25zZSBTdGF0dXMgRXJyb3IgQ29kZSAnICsgeGhyLnN0YXR1cyArICcgZnJvbSAnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlcXVlc3RQYXRoIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXh0ZW5zaW9ucyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIEh0bXhFeHRlbnNpb24+fSAqL1xuICBjb25zdCBleHRlbnNpb25zID0ge31cblxuICAvKipcbiAgICogZXh0ZW5zaW9uQmFzZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYWxsIGV4dGVuc2lvbnMuXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZXh0ZW5zaW9uQmFzZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5pdDogZnVuY3Rpb24oYXBpKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgb25FdmVudDogZnVuY3Rpb24obmFtZSwgZXZ0KSB7IHJldHVybiB0cnVlIH0sXG4gICAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24odGV4dCwgeGhyLCBlbHQpIHsgcmV0dXJuIHRleHQgfSxcbiAgICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgaGFuZGxlU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24oeGhyLCBwYXJhbWV0ZXJzLCBlbHQpIHsgcmV0dXJuIG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZWZpbmVFeHRlbnNpb24gaW5pdGlhbGl6ZXMgdGhlIGV4dGVuc2lvbiBhbmQgYWRkcyBpdCB0byB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNkZWZpbmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbn0gZXh0ZW5zaW9uIHRoZSBleHRlbnNpb24gZGVmaW5pdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gZGVmaW5lRXh0ZW5zaW9uKG5hbWUsIGV4dGVuc2lvbikge1xuICAgIGlmIChleHRlbnNpb24uaW5pdCkge1xuICAgICAgZXh0ZW5zaW9uLmluaXQoaW50ZXJuYWxBUEkpXG4gICAgfVxuICAgIGV4dGVuc2lvbnNbbmFtZV0gPSBtZXJnZU9iamVjdHMoZXh0ZW5zaW9uQmFzZSgpLCBleHRlbnNpb24pXG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlRXh0ZW5zaW9uIHJlbW92ZXMgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFeHRlbnNpb24obmFtZSkge1xuICAgIGRlbGV0ZSBleHRlbnNpb25zW25hbWVdXG4gIH1cblxuICAvKipcbiAgICogZ2V0RXh0ZW5zaW9ucyBzZWFyY2hlcyB1cCB0aGUgRE9NIHRyZWUgdG8gcmV0dXJuIGFsbCBleHRlbnNpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbltdPX0gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nW109fSBleHRlbnNpb25zVG9JZ25vcmVcbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEV4dGVuc2lvbnMoZWx0LCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSkge1xuICAgIGlmIChleHRlbnNpb25zVG9SZXR1cm4gPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9SZXR1cm4gPSBbXVxuICAgIH1cbiAgICBpZiAoZWx0ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbnNUb1JldHVyblxuICAgIH1cbiAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlID0gW11cbiAgICB9XG4gICAgY29uc3QgZXh0ZW5zaW9uc0ZvckVsZW1lbnQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1leHQnKVxuICAgIGlmIChleHRlbnNpb25zRm9yRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChleHRlbnNpb25zRm9yRWxlbWVudC5zcGxpdCgnLCcpLCBmdW5jdGlvbihleHRlbnNpb25OYW1lKSB7XG4gICAgICAgIGV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb25OYW1lLnJlcGxhY2UoLyAvZywgJycpXG4gICAgICAgIGlmIChleHRlbnNpb25OYW1lLnNsaWNlKDAsIDcpID09ICdpZ25vcmU6Jykge1xuICAgICAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZS5wdXNoKGV4dGVuc2lvbk5hbWUuc2xpY2UoNykpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZS5pbmRleE9mKGV4dGVuc2lvbk5hbWUpIDwgMCkge1xuICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uTmFtZV1cbiAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmIGV4dGVuc2lvbnNUb1JldHVybi5pbmRleE9mKGV4dGVuc2lvbikgPCAwKSB7XG4gICAgICAgICAgICBleHRlbnNpb25zVG9SZXR1cm4ucHVzaChleHRlbnNpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEluaXRpYWxpemF0aW9uXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpc1JlYWR5ID0gZmFsc2VcbiAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgaXNSZWFkeSA9IHRydWVcbiAgfSlcblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIG5vdyBpZiBET01Db250ZW50TG9hZGVkIGhhcyBmaXJlZCwgb3RoZXJ3aXNlIGxpc3RlbiBmb3IgaXQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdXNlcyBpc1JlYWR5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGFzayB0aGUgYnJvd3NlciB3aGV0aGVyXG4gICAqIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gZmlyZWQ7IHRoZXJlJ3MgYSBnYXAgYmV0d2VlbiBET01Db250ZW50TG9hZGVkXG4gICAqIGZpcmluZyBhbmQgcmVhZHlzdGF0ZT1jb21wbGV0ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWR5KGZuKSB7XG4gICAgLy8gQ2hlY2tpbmcgcmVhZHlTdGF0ZSBoZXJlIGlzIGEgZmFpbHNhZmUgaW4gY2FzZSB0aGUgaHRteCBzY3JpcHQgdGFnIGVudGVyZWQgdGhlIERPTSBieVxuICAgIC8vIHNvbWUgbWVhbnMgb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQuXG4gICAgaWYgKGlzUmVhZHkgfHwgZ2V0RG9jdW1lbnQoKS5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICBmbigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydEluZGljYXRvclN0eWxlcygpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaW5jbHVkZUluZGljYXRvclN0eWxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG5vbmNlQXR0cmlidXRlID0gaHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZSA/IGAgbm9uY2U9XCIke2h0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2V9XCJgIDogJydcbiAgICAgIGdldERvY3VtZW50KCkuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsXG4gICAgICAgICc8c3R5bGUnICsgbm9uY2VBdHRyaWJ1dGUgKyAnPlxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjB9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJyAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJy4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgPC9zdHlsZT4nKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1ldGFDb25maWcoKSB7XG4gICAgLyoqIEB0eXBlIEhUTUxNZXRhRWxlbWVudCAqL1xuICAgIGNvbnN0IGVsZW1lbnQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImh0bXgtY29uZmlnXCJdJylcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHBhcnNlSlNPTihlbGVtZW50LmNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VNZXRhQ29uZmlnKCkge1xuICAgIGNvbnN0IG1ldGFDb25maWcgPSBnZXRNZXRhQ29uZmlnKClcbiAgICBpZiAobWV0YUNvbmZpZykge1xuICAgICAgaHRteC5jb25maWcgPSBtZXJnZU9iamVjdHMoaHRteC5jb25maWcsIG1ldGFDb25maWcpXG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnRcbiAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgbWVyZ2VNZXRhQ29uZmlnKClcbiAgICBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKVxuICAgIGxldCBib2R5ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgcHJvY2Vzc05vZGUoYm9keSlcbiAgICBjb25zdCByZXN0b3JlZEVsdHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIltoeC10cmlnZ2VyPSdyZXN0b3JlZCddLFtkYXRhLWh4LXRyaWdnZXI9J3Jlc3RvcmVkJ11cIlxuICAgIClcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWJvcnQnLCBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXRcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YSh0YXJnZXQpXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhICYmIGludGVybmFsRGF0YS54aHIpIHtcbiAgICAgICAgaW50ZXJuYWxEYXRhLnhoci5hYm9ydCgpXG4gICAgICB9XG4gICAgfSlcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIGNvbnN0IG9yaWdpbmFsUG9wc3RhdGUgPSB3aW5kb3cub25wb3BzdGF0ZSA/IHdpbmRvdy5vbnBvcHN0YXRlLmJpbmQod2luZG93KSA6IG51bGxcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5zdGF0ZSAmJiBldmVudC5zdGF0ZS5odG14KSB7XG4gICAgICAgIHJlc3RvcmVIaXN0b3J5KClcbiAgICAgICAgZm9yRWFjaChyZXN0b3JlZEVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnJlc3RvcmVkJywge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGdldERvY3VtZW50KCksXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsUG9wc3RhdGUpIHtcbiAgICAgICAgICBvcmlnaW5hbFBvcHN0YXRlKGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoYm9keSwgJ2h0bXg6bG9hZCcsIHt9KSAvLyBnaXZlIHJlYWR5IGhhbmRsZXJzIGEgY2hhbmNlIHRvIGxvYWQgdXAgYmVmb3JlIGZpcmluZyB0aGlzIGV2ZW50XG4gICAgICBib2R5ID0gbnVsbCAvLyBraWxsIHJlZmVyZW5jZSBmb3IgZ2NcbiAgICB9LCAwKVxuICB9KVxuXG4gIHJldHVybiBodG14XG59KSgpXG5cbi8qKiBAdHlwZWRlZiB7J2dldCd8J2hlYWQnfCdwb3N0J3wncHV0J3wnZGVsZXRlJ3wnY29ubmVjdCd8J29wdGlvbnMnfCd0cmFjZSd8J3BhdGNoJ30gSHR0cFZlcmIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2FwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdE9PQl1cbiAqIEBwcm9wZXJ0eSB7Kn0gW2V2ZW50SW5mb11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYW5jaG9yXVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbY29udGV4dEVsZW1lbnRdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU3dhcENhbGxiYWNrXVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclNldHRsZUNhbGxiYWNrXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHN3YXBDYWxsYmFja1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeydpbm5lckhUTUwnIHwgJ291dGVySFRNTCcgfCAnYmVmb3JlYmVnaW4nIHwgJ2FmdGVyYmVnaW4nIHwgJ2JlZm9yZWVuZCcgfCAnYWZ0ZXJlbmQnIHwgJ2RlbGV0ZScgfCAnbm9uZScgfCBzdHJpbmd9IEh0bXhTd2FwU3R5bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEh0bXhTd2FwU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzd2FwRGVsYXlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZXR0bGVEZWxheVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJhbnNpdGlvbl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoZWFkXVxuICogQHByb3BlcnR5IHsndG9wJyB8ICdib3R0b20nfSBbc2Nyb2xsXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JvbGxUYXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3ddXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3dUYXJnZXRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb2N1c1Njcm9sbF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKHRoaXM6Tm9kZSwgZXZ0OkV2ZW50KSA9PiBib29sZWFuKSAmIHtzb3VyY2U6IHN0cmluZ319IENvbmRpdGlvbmFsRnVuY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9sbEludGVydmFsXVxuICogQHByb3BlcnR5IHtDb25kaXRpb25hbEZ1bmN0aW9ufSBbZXZlbnRGaWx0ZXJdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjaGFuZ2VkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbb25jZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnN1bWVdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmcm9tXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Rocm90dGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9vdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyZXNob2xkXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tlbHQ6IEVsZW1lbnQsIG1lc3NhZ2U6IHN0cmluZywgdmFsaWRpdHk6IFZhbGlkaXR5U3RhdGV9fSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gSFgtUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlclxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlci1OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UYXJnZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIWC1DdXJyZW50LVVSTFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtIWC1Qcm9tcHRdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUJvb3N0ZWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0NvbnRlbnQtVHlwZV1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3RdXG4gKi9cblxuLyoqIEB0eXBlZGVmIEh0bXhBamF4SGVscGVyQ29udGV4dFxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3NvdXJjZV1cbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IFtldmVudF1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlVXJsUGFyYW1zXG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHBhcmFtZXRlcnMgZm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IHVuZmlsdGVyZWRGb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHVuZmlsdGVyZWRQYXJhbWV0ZXJzIHVuZmlsdGVyZWRGb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn0gaGVhZGVyc1xuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEBwcm9wZXJ0eSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpdGhDcmVkZW50aWFsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoXG4gKiBAcHJvcGVydHkge0V2ZW50fSB0cmlnZ2VyaW5nRXZlbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUluZm9cbiAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhFdGN9IGV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VsZWN0XG4gKiBAcHJvcGVydHkge3tyZXF1ZXN0UGF0aDogc3RyaW5nLCBmaW5hbFJlcXVlc3RQYXRoOiBzdHJpbmcsIHJlc3BvbnNlUGF0aDogc3RyaW5nfG51bGwsIGFuY2hvcjogc3RyaW5nfX0gcGF0aEluZm9cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N1Y2Nlc3NmdWxdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtrZWVwSW5kaWNhdG9yc11cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhBamF4RXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXR1cm5Qcm9taXNlXVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFt0YXJnZXRPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2RlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBzd2FwXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlcnJvcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtldmVudF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIdG14UmVzcG9uc2VJbmZvICYge3Nob3VsZFN3YXA6IGJvb2xlYW4sIHNlcnZlclJlc3BvbnNlOiBhbnksIGlzRXJyb3I6IGJvb2xlYW4sIGlnbm9yZVRpdGxlOiBib29sZWFuLCBzZWxlY3RPdmVycmlkZTpzdHJpbmd9fSBIdG14QmVmb3JlU3dhcERldGFpbHNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBIdG14QWpheEhhbmRsZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygoKSA9PiB2b2lkKX0gSHRteFNldHRsZVRhc2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhTZXR0bGVJbmZvXG4gKiBAcHJvcGVydHkge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gZWx0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aXRsZV1cbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgtZXh0ZW5zaW9ucy9ibG9iL21haW4vUkVBRE1FLm1kXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14RXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkgeyhhcGk6IGFueSkgPT4gdm9pZH0gaW5pdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnR8Q3VzdG9tRXZlbnQpID0+IGJvb2xlYW59IG9uRXZlbnRcbiAqIEBwcm9wZXJ0eSB7KHRleHQ6IHN0cmluZywgeGhyOiBYTUxIdHRwUmVxdWVzdCwgZWx0OiBFbGVtZW50KSA9PiBzdHJpbmd9IHRyYW5zZm9ybVJlc3BvbnNlXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpID0+IGJvb2xlYW59IGlzSW5saW5lU3dhcFxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLCB0YXJnZXQ6IE5vZGUsIGZyYWdtZW50OiBOb2RlLCBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbykgPT4gYm9vbGVhbnxOb2RlW119IGhhbmRsZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHhocjogWE1MSHR0cFJlcXVlc3QsIHBhcmFtZXRlcnM6IEZvcm1EYXRhLCBlbHQ6IE5vZGUpID0+ICp8c3RyaW5nfG51bGx9IGVuY29kZVBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nW118bnVsbH0gZ2V0U2VsZWN0b3JzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGh0bXhcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBkZXBlbmRzT24ocGF0aFNwZWM6IGFueSwgdXJsOiBzdHJpbmcpIHtcbiAgaWYgKHBhdGhTcGVjID09PSBcImlnbm9yZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGRlcGVuZGVuY3lQYXRoID0gcGF0aFNwZWMuc3BsaXQoXCIvXCIpO1xuICBjb25zdCB1cmxQYXRoID0gdXJsLnNwbGl0KFwiL1wiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeUVsZW1lbnQgPSBkZXBlbmRlbmN5UGF0aC5zaGlmdCgpO1xuICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gdXJsUGF0aFtpXTtcbiAgICBpZiAoZGVwZW5kZW5jeUVsZW1lbnQgIT09IHBhdGhFbGVtZW50ICYmIGRlcGVuZGVuY3lFbGVtZW50ICE9PSBcIipcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDAgfHxcbiAgICAgIChkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDEgJiYgZGVwZW5kZW5jeVBhdGhbMF0gPT09IFwiXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgZWx0c1dpdGhEZXBzID0gaHRteC5maW5kQWxsKFwiW3BhdGgtZGVwc11cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0c1dpdGhEZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZWx0ID0gZWx0c1dpdGhEZXBzW2ldO1xuICAgIGlmIChkZXBlbmRzT24oZWx0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSwgcGF0aCkpIHtcbiAgICAgIGh0bXgudHJpZ2dlcihlbHQsIFwicGF0aC1kZXBzXCIsIG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInBhdGgtZGVwc1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmJlZm9yZU9uTG9hZFwiKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBldnQuZGV0YWlsLnJlcXVlc3RDb25maWc7XG4gICAgICAvLyBtdXRhdGluZyBjYWxsXG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZyAmJlxuICAgICAgICBjb25maWcudmVyYiAhPT0gXCJnZXRcIiAmJlxuICAgICAgICBldnQudGFyZ2V0ICE9IG51bGwgJiZcbiAgICAgICAgZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgZXZ0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIikgIT09IFwiaWdub3JlXCJcbiAgICAgICkge1xuICAgICAgICByZWZyZXNoUGF0aChjb25maWcucGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCwge0h0bXhTZXR0bGVJbmZvLCBIdG14U3dhcFN0eWxlfSBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbn1cblxuY29uc3QgaWdub3JlZEV2ZW50cyA9IFsnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCAnaHRteDpiZWZvcmVTd2FwJywgJ2h0bXg6YWZ0ZXJTd2FwJywgJ2h0bXg6YmVmb3JlT25Mb2FkJywgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCAnaHRteDpjb25maWdSZXF1ZXN0JywgJ2h0bXg6Y29uZmlnUmVzcG9uc2UnLCAnaHRteDpyZXNwb25zZUVycm9yJ107XG5cbmZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWU6IHN0cmluZywgZGV0YWlsOiBhbnkpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG59XG5cbmZ1bmN0aW9uIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQ6IEhUTUxFbGVtZW50LCBuYW1lOiBzdHJpbmcsIGV2ZW50OiBDdXN0b21FdmVudCwgdHJpZ2dlcmVkOiBTZXQ8SFRNTEVsZW1lbnQ+KSB7XG4gICAgaWYoaWdub3JlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY2hpbGRyZW4pIHtcbiAgICAgICAgQXJyYXkuZnJvbSh0YXJnZXQuY2hpbGRyZW4pLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtlaGFiID0ga2ViYWJFdmVudE5hbWUobmFtZSk7XG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBrZWhhYi5yZXBsYWNlKFwiaHRteDpcIiwgXCJoeC1vbjo6XCIpXG4gICAgICAgICAgICBpZiAoIXRyaWdnZXJlZC5oYXMoZSBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBpZihlLmhhc0F0dHJpYnV0ZShldmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZS5yZXBsYWNlKFwiaHgtb246OlwiLCBcImh0bXg6XCIpLCBldmVudC5kZXRhaWwpXG4gICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmRldGFpbC5tZXRhID0gJ3RyaWdnZXItY2hpbGRyZW4nXG4gICAgICAgICAgICAgICAgICAgIGUuZGlzcGF0Y2hFdmVudChuZXdFdmVudClcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkLmFkZChlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoaWxkcmVuKGUgYXMgSFRNTEVsZW1lbnQsIG5hbWUsIGV2ZW50LCB0cmlnZ2VyZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwidHJpZ2dlci1jaGlsZHJlblwiLCB7XG4gICAgb25FdmVudDogKG5hbWUsIGV2dDogRXZlbnQgfCBDdXN0b21FdmVudCkgPT4ge1xuICAgICAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZihldnQuZGV0YWlsLm1ldGEgPT09ICd0cmlnZ2VyLWNoaWxkcmVuJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyaWdnZXJlZCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfHwgZXZ0LmRldGFpbC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQsIG5hbWUsIGV2dCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpOiBhbnkpOiB2b2lkIHtcbiAgICB9LFxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbiAoXG4gICAgICAgIHRleHQ6IHN0cmluZyxcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgZWx0OiBFbGVtZW50LFxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH0sXG4gICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbiAoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uIChcbiAgICAgICAgc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLFxuICAgICAgICB0YXJnZXQ6IE5vZGUsXG4gICAgICAgIGZyYWdtZW50OiBOb2RlLFxuICAgICAgICBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbyxcbiAgICApOiBib29sZWFuIHwgTm9kZVtdIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24gKFxuICAgICAgICB4aHI6IFhNTEh0dHBSZXF1ZXN0LFxuICAgICAgICBwYXJhbWV0ZXJzOiBGb3JtRGF0YSxcbiAgICAgICAgZWx0OiBOb2RlLFxuICAgICkge1xuICAgIH0sXG4gICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbiAoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiZGVidWdcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoY29uc29sZS5kZWJ1Zykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhuYW1lLCBldnQpO1xuICAgIH0gZWxzZSBpZiAoY29uc29sZSkge1xuICAgICAgY29uc29sZS5sb2coXCJERUJVRzpcIiwgbmFtZSwgZXZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm9vcFxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5jb25zdCBjb25maWc6IGFueSA9IGh0bXguY29uZmlnO1xuXG4vKiogQHR5cGUge2ltcG9ydChcIi4uL2h0bXhcIikuSHRteEludGVybmFsQXBpfSAqL1xubGV0IGFwaTogYW55O1xuXG5jb25zdCBhdHRyUHJlZml4ID0gXCJoeC10YXJnZXQtXCI7XG5cbi8vIElFMTEgZG9lc24ndCBzdXBwb3J0IHN0cmluZy5zdGFydHNXaXRoXG5mdW5jdGlvbiBzdGFydHNXaXRoKHN0cjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZykge1xuICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHJlc3BDb2RlTnVtYmVyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfVxuICovXG5mdW5jdGlvbiBnZXRSZXNwQ29kZVRhcmdldChlbHQ6IEVsZW1lbnQsIHJlc3BDb2RlTnVtYmVyOiBudW1iZXIpIHtcbiAgaWYgKCFlbHQgfHwgIXJlc3BDb2RlTnVtYmVyKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCByZXNwQ29kZSA9IHJlc3BDb2RlTnVtYmVyLnRvU3RyaW5nKCk7XG5cbiAgLy8gJyonIGlzIHRoZSBvcmlnaW5hbCBzeW50YXgsIGFzIHRoZSBvYnZpb3VzIGNoYXJhY3RlciBmb3IgYSB3aWxkY2FyZC5cbiAgLy8gVGhlICd4JyBhbHRlcm5hdGl2ZSB3YXMgYWRkZWQgZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIEhUTUxcbiAgLy8gdGVtcGxhdGluZyBlbmdpbmVzLCBkdWUgdG8gYW1iaWd1aXR5IGFyb3VuZCB3aGljaCBjaGFyYWN0ZXJzIGFyZVxuICAvLyBzdXBwb3J0ZWQgaW4gSFRNTCBhdHRyaWJ1dGVzLlxuICAvL1xuICAvLyBTdGFydCB3aXRoIHRoZSBtb3N0IHNwZWNpZmljIHBvc3NpYmxlIGF0dHJpYnV0ZSBhbmQgZ2VuZXJhbGl6ZSBmcm9tXG4gIC8vIHRoZXJlLlxuICBjb25zdCBhdHRyUG9zc2liaWxpdGllcyA9IFtcbiAgICByZXNwQ29kZSxcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwieFwiLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4XCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieHhcIixcblxuICAgIFwiKlwiLFxuICAgIFwieFwiLFxuICAgIFwiKioqXCIsXG4gICAgXCJ4eHhcIixcbiAgXTtcbiAgaWYgKHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNFwiKSB8fCBzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjVcIikpIHtcbiAgICBhdHRyUG9zc2liaWxpdGllcy5wdXNoKFwiZXJyb3JcIik7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJQb3NzaWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXR0ciA9IGF0dHJQcmVmaXggKyBhdHRyUG9zc2liaWxpdGllc1tpXTtcbiAgICBjb25zdCBhdHRyVmFsdWUgPSBhcGkuZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cik7XG4gICAgaWYgKGF0dHJWYWx1ZSkge1xuICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gXCJ0aGlzXCIpIHtcbiAgICAgICAgcmV0dXJuIGFwaS5maW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhcGkucXVlcnlTZWxlY3RvckV4dChlbHQsIGF0dHJWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBAcGFyYW0ge0V2ZW50fSBldnQgKi9cbmZ1bmN0aW9uIGhhbmRsZUVycm9yRmxhZyhldnQ6IEN1c3RvbUV2ZW50KSB7XG4gIGlmIChldnQuZGV0YWlsLmlzRXJyb3IpIHtcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IpIHtcbiAgICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IpIHtcbiAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSB0cnVlO1xuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicmVzcG9uc2UtdGFyZ2V0c1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaW5pdDogKGFwaVJlZikgPT4ge1xuICAgIGFwaSA9IGFwaVJlZjtcblxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5hbWUgPT09IFwiaHRteDpiZWZvcmVTd2FwXCIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyICYmXG4gICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMgIT09IDIwMFxuICAgICkge1xuICAgICAgaWYgKGV2dC5kZXRhaWwudGFyZ2V0KSB7XG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcpIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgJiZcbiAgICAgICAgICBldnQuZGV0YWlsLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5tYXRjaCgvSFgtUmV0YXJnZXQ6L2kpXG4gICAgICAgICkge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0UmVzcENvZGVUYXJnZXQoXG4gICAgICAgIGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZy5lbHQsXG4gICAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyxcbiAgICAgICk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICBldnQuZGV0YWlsLnRhcmdldCA9IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibXV0YXRpb24tZXJyb3JcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDphZnRlclJlcXVlc3RcIikge1xuICAgICAgaWYgKCFldnQuZGV0YWlsIHx8ICFldnQuZGV0YWlsLnhocikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0dXMgPSBldnQuZGV0YWlsLnhoci5zdGF0dXM7XG4gICAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICBodG14LmZpbmRBbGwoXCJbaHgtb25cXFxcOlxcXFw6bXV0YXRpb24tZXJyb3JdXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgXCJodG14Om11dGF0aW9uLWVycm9yXCIsIHsgc3RhdHVzIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IHtjcmVhdGVXZWJTb2NrZXRDbGllbnR9IGZyb20gXCIuLi91dGlsL3dzXCI7XG5cbmxldCBsYXN0VmVyc2lvbiA9IFwiXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibGl2ZXJlbG9hZFwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBlbmFibGVkID0gZmFsc2VcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIEFycmF5LmZyb20oaHRteC5maW5kQWxsKFwiW2h4LWV4dF1cIikpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtZXh0XCIpO1xuICAgICAgICAgICAgaWYodmFsdWU/LnNwbGl0KFwiIFwiKS5pbmNsdWRlcyhcImxpdmVyZWxvYWRcIikpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ2xpdmVyZWxvYWQgZXh0ZW5zaW9uIGluaXRpYWxpemVkLicpO1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRXZlbnRTb3VyY2Ugb2JqZWN0IGFuZCBwb2ludCBpdCB0byB5b3VyIFNTRSBlbmRwb2ludFxuICAgICAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2Rldi9saXZlcmVsb2FkJyk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YVxuICAgICAgICAgICAgLy8gTG9nIHRoZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uICE9PSBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgIHJlbG9hZCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgKGUuZy4sIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkKVxuICAgICAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50U291cmNlIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgfTtcblxuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcblxuICAgIH0sXG59KTtcblxuZnVuY3Rpb24gcmVsb2FkKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxufSIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5jb25zdCBldmFsRnVuY1JlZ2V4ID0vX19ldmFsX1tBLVphLXowLTldK1xcKFthLXpdK1xcKS9nbVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImh0bWdvXCIsIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgIGlmKG5hbWUgPT09IFwiaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcblxubGV0IGFwaSA6IGFueSA9IG51bGw7XG5sZXQgcHJvY2Vzc2VkID0gbmV3IFNldDxzdHJpbmc+KClcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJzc2VcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGlSZWYpIHtcbiAgICAgICAgYXBpID0gYXBpUmVmO1xuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldDtcbiAgICAgICAgaWYoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tzc2UtY29ubmVjdF0nKTtcbiAgICAgICAgICAgIGZvciAobGV0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNzZS1jb25uZWN0XCIpITtcbiAgICAgICAgICAgICAgICBpZih1cmwgJiYgIXByb2Nlc3NlZC5oYXModXJsKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0RXZlbnRTb3VyY2UoZWxlbWVudCwgdXJsKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQuYWRkKHVybClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KVxuXG5mdW5jdGlvbiBjb25uZWN0RXZlbnRTb3VyY2UoZWxlOiBFbGVtZW50LCB1cmw6IHN0cmluZykge1xuICAgIGlmKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbygnQ29ubmVjdGluZyB0byBFdmVudFNvdXJjZScsIHVybClcbiAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0V2ZW50U291cmNlIG9wZW46JywgZXZlbnQpO1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlT3BlblwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VFcnJvclwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09IEV2ZW50U291cmNlLkNMT1NFRCkge1xuICAgICAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdFdmVudFNvdXJjZSBtZXNzYWdlOicsIGV2ZW50LmRhdGEpO1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHt0YXNrczogW119KTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG5mdW5jdGlvbiB3YXRjaFVybChjYWxsYmFjazogKG9sZFVybDogc3RyaW5nLCBuZXdVcmw6IHN0cmluZykgPT4gdm9pZCkge1xuICBsZXQgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBsYXN0VXJsKSB7XG4gICAgICBjYWxsYmFjayhsYXN0VXJsLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuICB9LCAxMDApO1xufVxuXG53YXRjaFVybCgoXywgbmV3VXJsKSA9PiB7XG4gIG9uVXJsQ2hhbmdlKG5ld1VybCk7XG59KTtcblxuZnVuY3Rpb24gb25VcmxDaGFuZ2UobmV3VXJsOiBzdHJpbmcpIHtcbiAgbGV0IHVybCA9IG5ldyBVUkwobmV3VXJsKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXJdXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtdHJpZ2dlclwiKTtcbiAgICBpZiAoIXRyaWdnZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gdHJpZ2dlcnMuc3BsaXQoXCIsIFwiKTtcbiAgICBpZiAoc3BsaXQuZmluZCgocykgPT4gcyA9PT0gXCJ1cmxcIikpIHtcbiAgICAgIGh0bXguc3dhcChlbGVtZW50LCBcInVybFwiLCB7XG4gICAgICAgIHN3YXBTdHlsZTogXCJvdXRlckhUTUxcIixcbiAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZXNdIG9mIHVybC5zZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgbGV0IGV2ZW50TmFtZSA9IFwicXM6XCIgKyBrZXk7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5pbmNsdWRlcyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0cmlnZ2VyaW5nXCIsIGV2ZW50TmFtZSk7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIGV2ZW50TmFtZSwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtbWF0Y2gtcXBdXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBlbC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIikpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5yZXBsYWNlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiwgXCJcIik7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KG1hdGNoKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgaHRteC5zd2FwKGVsLCBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgPz8gXCJcIiwge1xuICAgICAgICAgICAgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLFxuICAgICAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGFzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzTWF0Y2gpIHtcbiAgICAgIGxldCBkZWZhdWx0S2V5ID0gZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtZGVmYXVsdFwiKTtcbiAgICAgIGlmIChkZWZhdWx0S2V5KSB7XG4gICAgICAgIGh0bXguc3dhcChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiICsgZGVmYXVsdEtleSkgPz8gXCJcIixcbiAgICAgICAgICB7IHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIiwgc3dhcERlbGF5OiAwLCBzZXR0bGVEZWxheTogMCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iXX0= \ No newline at end of file diff --git a/framework/assets/js/htmgo.ts b/framework/assets/js/htmgo.ts index aee46a3..898d00b 100644 --- a/framework/assets/js/htmgo.ts +++ b/framework/assets/js/htmgo.ts @@ -6,7 +6,7 @@ import "./htmxextensions/response-targets"; import "./htmxextensions/mutation-error"; import "./htmxextensions/livereload" import "./htmxextensions/htmgo"; -import "./htmxextensions/ws" +import "./htmxextensions/sse" function watchUrl(callback: (oldUrl: string, newUrl: string) => void) { let lastUrl = window.location.href; diff --git a/framework/assets/js/htmxextensions/sse.ts b/framework/assets/js/htmxextensions/sse.ts new file mode 100644 index 0000000..f422c5c --- /dev/null +++ b/framework/assets/js/htmxextensions/sse.ts @@ -0,0 +1,64 @@ +import htmx from 'htmx.org' + +let api : any = null; +let processed = new Set() + +htmx.defineExtension("sse", { + init: function (apiRef) { + api = apiRef; + }, + // @ts-ignore + onEvent: function (name, evt) { + const target = evt.target; + if(!(target instanceof HTMLElement)) { + return + } + + if(name === 'htmx:beforeProcessNode') { + const elements = document.querySelectorAll('[sse-connect]'); + for (let element of Array.from(elements)) { + const url = element.getAttribute("sse-connect")!; + if(url && !processed.has(url)) { + connectEventSource(element, url) + processed.add(url) + } + } + } + } +}) + +function connectEventSource(ele: Element, url: string) { + if(!url) { + return + } + console.info('Connecting to EventSource', url) + const eventSource = new EventSource(url); + + eventSource.onopen = function(event) { + console.log('EventSource open:', event); + htmx.trigger(ele, "htmx:sseOpen", {event: event}); + } + + eventSource.onerror = function(event) { + htmx.trigger(ele, "htmx:sseError", {event: event}); + if (eventSource.readyState == EventSource.CLOSED) { + htmx.trigger(ele, "htmx:sseClose", {event: event}); + } + } + + eventSource.onmessage = function(event) { + console.log('EventSource message:', event.data); + htmx.trigger(ele, "htmx:sseBeforeMessage", {event: event}); + const response = event.data + const fragment = api.makeFragment(response) as DocumentFragment; + const children = Array.from(fragment.children); + for (let child of children) { + api.oobSwap(api.getAttributeValue(child, 'hx-swap-oob') || 'true', child, {tasks: []}); + // support htmgo eval__ scripts + if(child.tagName === 'SCRIPT' && child.id.startsWith("__eval")) { + document.body.appendChild(child); + } + } + htmx.trigger(ele, "htmx:sseAfterMessage", {event: event}); + } +} diff --git a/framework/assets/js/htmxextensions/ws.ts b/framework/assets/js/htmxextensions/ws.ts deleted file mode 100644 index 0879c5e..0000000 --- a/framework/assets/js/htmxextensions/ws.ts +++ /dev/null @@ -1,418 +0,0 @@ -import htmx from 'htmx.org' -import {removeAssociatedScripts} from "./htmgo"; - - - -interface HtmxInternalApi { - getInternalData(elt: Element): any; - bodyContains(elt: Element): boolean; - getAttributeValue(elt: Element, name: string): string | null; - triggerEvent(elt: Element, name: string, detail?: any): boolean; - withExtensions(elt: Element, callback: (extension: any) => void): void; - makeSettleInfo(elt: Element): any; - makeFragment(html: string): DocumentFragment; - oobSwap(swapStyle: string, fragment: Element, settleInfo: any): void; - settleImmediately(tasks: any): void; - getClosestMatch(elt: Element, condition: (node: Element) => boolean): Element | null; - getTriggerSpecs(elt: Element): any[]; - addTriggerHandler(elt: Element, triggerSpec: any, nodeData: any, handler: (elt: Element, evt: Event) => void): void; - getHeaders(elt: Element, target: Element): any; - getTarget(elt: Element): Element; - getInputValues(elt: Element, verb: string): { errors: any[]; values: any }; - getExpressionVars(elt: Element): any; - mergeObjects(obj1: any, obj2: any): any; - filterValues(values: any, elt: Element): any; - triggerErrorEvent(elt?: Element, name?: string, detail?: any): void; - hasAttribute(elt: Element, name: string): boolean; - shouldCancel(evt: Event, elt: Element): boolean; - [key: string]: any; -} - -interface WebSocketWrapper { - socket: WebSocket; - events : { [key: string]: ((event: Event) => void)[] }; - messageQueue: { message: string; sendElt: Element | null }[]; - retryCount: number; - sendImmediately(message: string, sendElt: Element | null): void; - send(message: string, sendElt: Element | null): void; - addEventListener(event: string, handler: (event: Event) => void): void; - handleQueuedMessages(): void; - init(): void; - close(): void; - publicInterface: { - send: (message: string, sendElt: Element | null) => void; - sendImmediately: (message: string, sendElt: Element | null) => void; - queue: { message: string; sendElt: Element | null }[]; - }; -} - -let api: HtmxInternalApi; - -function splitOnWhitespace(trigger: string): string[] { - return trigger.trim().split(/\s+/); -} - -function getLegacyWebsocketURL(elt: Element): string | undefined { - const legacySSEValue = api.getAttributeValue(elt, 'hx-ws'); - if (legacySSEValue) { - const values = splitOnWhitespace(legacySSEValue); - for (let i = 0; i < values.length; i++) { - const value = values[i].split(/:(.+)/); - if (value[0] === 'connect') { - return value[1]; - } - } - } - return undefined; -} - -function ensureWebSocket(socketElt: HTMLElement): void { - // If the element containing the WebSocket connection no longer exists, then - // do not connect/reconnect the WebSocket. - if (!api.bodyContains(socketElt)) { - return; - } - - // Get the source straight from the element's value - let wssSource = api.getAttributeValue(socketElt, 'ws-connect'); - - if (wssSource == null || wssSource === '') { - const legacySource = getLegacyWebsocketURL(socketElt); - if (legacySource == null) { - return; - } else { - wssSource = legacySource; - } - } - - // Guarantee that the wssSource value is a fully qualified URL - if (wssSource.indexOf('/') === 0) { - const base_part = location.hostname + (location.port ? ':' + location.port : ''); - if (location.protocol === 'https:') { - wssSource = 'wss://' + base_part + wssSource; - } else if (location.protocol === 'http:') { - wssSource = 'ws://' + base_part + wssSource; - } - } - - const socketWrapper = createWebsocketWrapper(socketElt, () => createWebSocket(wssSource)); - - socketWrapper.addEventListener('message', (event) => { - if (maybeCloseWebSocketSource(socketElt)) { - return; - } - - let response = (event as MessageEvent).data; - if ( - !api.triggerEvent(socketElt, 'htmx:wsBeforeMessage', { - message: response, - socketWrapper: socketWrapper.publicInterface, - }) - ) { - return; - } - - api.withExtensions(socketElt, (extension) => { - response = extension.transformResponse(response, null, socketElt); - }); - - const settleInfo = api.makeSettleInfo(socketElt); - const fragment = api.makeFragment(response); - - if (fragment.children.length) { - const children = Array.from(fragment.children); - for (let i = 0; i < children.length; i++) { - const child = children[i] - api.oobSwap(api.getAttributeValue(child, 'hx-swap-oob') || 'true', children[i], settleInfo); - // support htmgo eval__ scripts - if(child.tagName === 'SCRIPT' && child.id.startsWith("__eval")) { - document.body.appendChild(child); - } - } - } - - api.settleImmediately(settleInfo.tasks); - api.triggerEvent(socketElt, 'htmx:wsAfterMessage', { - message: response, - socketWrapper: socketWrapper.publicInterface, - }); - }); - - // Put the WebSocket into the HTML Element's custom data. - api.getInternalData(socketElt).webSocket = socketWrapper; -} - -function createWebsocketWrapper(socketElt: HTMLElement, socketFunc: () => WebSocket): WebSocketWrapper { - const wrapper: WebSocketWrapper = { - socket: null as unknown as WebSocket, - messageQueue: [], - retryCount: 0, - events: {} as { [key: string]: ((event: Event) => void)[] }, - addEventListener(event: string, handler: (event: Event) => void) { - if (this.socket) { - this.socket.addEventListener(event, handler); - } - - if (!this.events[event]) { - this.events[event] = []; - } - - this.events[event].push(handler); - }, - sendImmediately(message: string, sendElt: Element | null) { - if (!this.socket) { - api.triggerErrorEvent(socketElt, 'htmx:wsError', { error: 'No socket available' }); - } - if ( - !sendElt || - api.triggerEvent(sendElt, 'htmx:wsBeforeSend', { - message, - socketWrapper: this.publicInterface, - }) - ) { - this.socket.send(message); - if (sendElt) { - api.triggerEvent(sendElt, 'htmx:wsAfterSend', { - message, - socketWrapper: this.publicInterface, - }); - } - } - }, - send(message: string, sendElt: Element | null) { - if (this.socket.readyState !== this.socket.OPEN) { - this.messageQueue.push({ message, sendElt }); - } else { - this.sendImmediately(message, sendElt); - } - }, - handleQueuedMessages() { - while (this.messageQueue.length > 0) { - const queuedItem = this.messageQueue[0]; - if (this.socket.readyState === this.socket.OPEN) { - this.sendImmediately(queuedItem.message, queuedItem.sendElt); - this.messageQueue.shift(); - } else { - break; - } - } - }, - init() { - if (this.socket && this.socket.readyState === this.socket.OPEN) { - // Close discarded socket - this.socket.close(); - } - - // Create a new WebSocket and event handlers - const socket = socketFunc(); - - // The event.type detail is added for interface conformance with the - // other two lifecycle events (open and close) so a single handler method - // can handle them polymorphically, if required. - api.triggerEvent(socketElt, 'htmx:wsConnecting', { event: { type: 'connecting' } }); - - this.socket = socket; - - socket.onopen = (e) => { - this.retryCount = 0; - api.triggerEvent(socketElt, 'htmx:wsOpen', { event: e, socketWrapper: this.publicInterface }); - this.handleQueuedMessages(); - }; - - socket.onclose = (e) => { - // If socket should not be connected, stop further attempts to establish connection - // If Abnormal Closure/Service Restart/Try Again Later, then set a timer to reconnect after a pause. - if (!maybeCloseWebSocketSource(socketElt) && [1006, 1012, 1013].indexOf(e.code) >= 0) { - const delay = getWebSocketReconnectDelay(this.retryCount); - setTimeout(() => { - this.retryCount += 1; - this.init(); - }, delay); - } - - // Notify client code that connection has been closed. Client code can inspect `event` field - // to determine whether closure has been valid or abnormal - api.triggerEvent(socketElt, 'htmx:wsClose', { event: e, socketWrapper: this.publicInterface }); - }; - - socket.onerror = (e) => { - api.triggerErrorEvent(socketElt, 'htmx:wsError', { error: e, socketWrapper: this }); - maybeCloseWebSocketSource(socketElt); - }; - - const events = this.events; - Object.keys(events).forEach((k) => { - events[k].forEach((e) => { - socket.addEventListener(k, e); - }); - }); - }, - close() { - this.socket.close(); - }, - publicInterface: {} as any, - }; - - wrapper.init(); - - wrapper.publicInterface = { - send: wrapper.send.bind(wrapper), - sendImmediately: wrapper.sendImmediately.bind(wrapper), - queue: wrapper.messageQueue, - }; - - return wrapper; -} - -function ensureWebSocketSend(elt: HTMLElement): void { - const legacyAttribute = api.getAttributeValue(elt, 'hx-ws'); - if (legacyAttribute && legacyAttribute !== 'send') { - return; - } - - const webSocketParent = api.getClosestMatch(elt, (node) => { - return hasWebSocket(node as HTMLElement); - }); - if (webSocketParent) { - processWebSocketSend(webSocketParent as HTMLElement, elt); - } -} - -function hasWebSocket(node: HTMLElement): boolean { - return api.getInternalData(node).webSocket != null; -} - -function processWebSocketSend(socketElt: HTMLElement, sendElt: HTMLElement): void { - const nodeData = api.getInternalData(sendElt); - const triggerSpecs = api.getTriggerSpecs(sendElt); - triggerSpecs.forEach((ts) => { - api.addTriggerHandler(sendElt, ts, nodeData, (elt: Element, evt: Event) => { - if (maybeCloseWebSocketSource(socketElt)) { - return; - } - - const socketWrapper: WebSocketWrapper = api.getInternalData(socketElt).webSocket; - const headers = api.getHeaders(sendElt, api.getTarget(sendElt)); - const results = api.getInputValues(sendElt, 'post'); - const errors = results.errors; - const rawParameters = Object.assign({}, results.values); - const expressionVars = api.getExpressionVars(sendElt); - const allParameters = api.mergeObjects(rawParameters, expressionVars); - const filteredParameters = api.filterValues(allParameters, sendElt); - - const sendConfig = { - parameters: filteredParameters, - unfilteredParameters: allParameters, - headers, - errors, - - triggeringEvent: evt, - messageBody: undefined as string | undefined, - socketWrapper: socketWrapper.publicInterface, - }; - - if (!api.triggerEvent(elt, 'htmx:wsConfigSend', sendConfig)) { - return; - } - - if (errors && errors.length > 0) { - api.triggerEvent(elt, 'htmx:validation:halted', errors); - return; - } - - let body = sendConfig.messageBody; - if (body === undefined) { - const toSend = Object.assign({}, sendConfig.parameters); - if (sendConfig.headers) { - toSend.HEADERS = headers; - } - body = JSON.stringify(toSend); - } - - socketWrapper.send(body, elt as Element); - - if (evt && api.shouldCancel(evt, elt as Element)) { - evt.preventDefault(); - } - }); - }); -} - -function getWebSocketReconnectDelay(retryCount: number): number { - const exp = Math.min(retryCount, 6); - const maxDelay = 1000 * Math.pow(2, exp); - return maxDelay * Math.random(); -} - -function maybeCloseWebSocketSource(elt: HTMLElement): boolean { - if (!api.bodyContains(elt)) { - api.getInternalData(elt).webSocket.close(); - return true; - } - return false; -} - -function createWebSocket(url: string): WebSocket { - const sock = new WebSocket(url, []); - sock.binaryType = (htmx.config.wsBinaryType || 'blob') as unknown as BinaryType; - return sock; -} - -function queryAttributeOnThisOrChildren(elt: HTMLElement, attributeName: string): HTMLElement[] { - const result: HTMLElement[] = []; - - // If the parent element also contains the requested attribute, then add it to the results too. - if (api.hasAttribute(elt, attributeName) || api.hasAttribute(elt, 'hx-ws')) { - result.push(elt); - } - - // Search all child nodes that match the requested attribute - elt.querySelectorAll('[' + attributeName + '], [data-' + attributeName + '], [data-hx-ws], [hx-ws]').forEach((node) => { - result.push(node as HTMLElement); - }); - - return result; -} - -function forEach(arr: T[], func: (item: T) => void): void { - if (arr) { - arr.forEach(func); - } -} - -htmx.defineExtension('ws', { - init: (apiRef: HtmxInternalApi) => { - // Store reference to internal API - api = apiRef; - }, - - // @ts-ignore - onEvent: (name: string, evt: Event) => { - const parent: Element = evt.target as Element || (evt as CustomEvent).detail.elt; - - if(!(parent instanceof HTMLElement)) { - return - } - - switch (name) { - // Try to close the socket when elements are removed - case 'htmx:beforeCleanupElement': - removeAssociatedScripts(parent); - const internalData = api.getInternalData(parent); - if (internalData.webSocket) { - internalData.webSocket.close(); - } - return; - - // Try to create websockets when elements are processed - case 'htmx:beforeProcessNode': - if(parent.hasAttribute("ws-connect")) { - ensureWebSocket(parent as HTMLElement); - } - - if(parent.hasAttribute("ws-send")) { - ensureWebSocketSend(parent as HTMLElement); - } - } - }, -}); diff --git a/framework/h/attribute.go b/framework/h/attribute.go index bdcfef3..7cf8fd0 100644 --- a/framework/h/attribute.go +++ b/framework/h/attribute.go @@ -53,6 +53,10 @@ func NewAttributeMap(pairs ...string) *AttributeMapOrdered { return &AttributeMapOrdered{data: m} } +func NoSwap() *AttributeR { + return Attribute("hx-swap", "none") +} + func Attribute(key string, value string) *AttributeR { return &AttributeR{ Name: key, diff --git a/framework/h/base.go b/framework/h/base.go index 027e013..1ec82a1 100644 --- a/framework/h/base.go +++ b/framework/h/base.go @@ -68,6 +68,10 @@ func SwapPartial(ctx *RequestContext, swap *Element) *Partial { SwapMany(ctx, swap)) } +func EmptyPartial() *Partial { + return NewPartial(Fragment()) +} + func SwapManyPartial(ctx *RequestContext, swaps ...*Element) *Partial { return NewPartial( SwapMany(ctx, swaps...), diff --git a/framework/h/extensions.go b/framework/h/extensions.go index 0518e36..8eda90d 100644 --- a/framework/h/extensions.go +++ b/framework/h/extensions.go @@ -3,7 +3,7 @@ package h import "strings" func BaseExtensions() string { - extensions := []string{"path-deps", "response-targets", "mutation-error", "htmgo"} + extensions := []string{"path-deps", "response-targets", "mutation-error", "htmgo", "sse"} if IsDevelopment() { extensions = append(extensions, "livereload") } diff --git a/framework/h/lifecycle.go b/framework/h/lifecycle.go index 5d572aa..295b50d 100644 --- a/framework/h/lifecycle.go +++ b/framework/h/lifecycle.go @@ -60,16 +60,6 @@ func (l *LifeCycle) HxBeforeRequest(cmd ...Command) *LifeCycle { return l } -func (l *LifeCycle) HxBeforeWsSend(cmd ...Command) *LifeCycle { - l.OnEvent(hx.BeforeWsSendEvent, cmd...) - return l -} - -func (l *LifeCycle) HxAfterWsSend(cmd ...Command) *LifeCycle { - l.OnEvent(hx.AfterWsSendEvent, cmd...) - return l -} - func HxOnLoad(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.LoadEvent, cmd...) } @@ -86,40 +76,32 @@ func OnEvent(event hx.Event, cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(event, cmd...) } -func HxBeforeWsMessage(cmd ...Command) *LifeCycle { - return NewLifeCycle().OnEvent(hx.WsBeforeMessageEvent, cmd...) +func HxBeforeSseMessage(cmd ...Command) *LifeCycle { + return NewLifeCycle().OnEvent(hx.SseBeforeMessageEvent, cmd...) } -func HxAfterWsMessage(cmd ...Command) *LifeCycle { - return NewLifeCycle().OnEvent(hx.WsAfterMessageEvent, cmd...) +func HxAfterSseMessage(cmd ...Command) *LifeCycle { + return NewLifeCycle().OnEvent(hx.SseAfterMessageEvent, cmd...) } func OnSubmit(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.SubmitEvent, cmd...) } -func HxOnWsError(cmd ...Command) *LifeCycle { - return NewLifeCycle().OnEvent(hx.WsErrorEvent, cmd...) +func HxOnSseError(cmd ...Command) *LifeCycle { + return NewLifeCycle().OnEvent(hx.SseErrorEvent, cmd...) } -func HxOnWsClose(cmd ...Command) *LifeCycle { - return NewLifeCycle().OnEvent(hx.WsClosedEvent, cmd...) +func HxOnSseClose(cmd ...Command) *LifeCycle { + return NewLifeCycle().OnEvent(hx.SseClosedEvent, cmd...) } -func HxOnWsConnecting(cmd ...Command) *LifeCycle { - return NewLifeCycle().OnEvent(hx.WsConnectingEvent, cmd...) +func HxOnSseConnecting(cmd ...Command) *LifeCycle { + return NewLifeCycle().OnEvent(hx.SseConnectingEvent, cmd...) } -func HxOnWsOpen(cmd ...Command) *LifeCycle { - return NewLifeCycle().OnEvent(hx.WsConnectedEvent, cmd...) -} - -func HxBeforeWsSend(cmd ...Command) *LifeCycle { - return NewLifeCycle().HxBeforeWsSend(cmd...) -} - -func HxAfterWsSend(cmd ...Command) *LifeCycle { - return NewLifeCycle().HxAfterWsSend(cmd...) +func HxOnSseOpen(cmd ...Command) *LifeCycle { + return NewLifeCycle().OnEvent(hx.SseConnectedEvent, cmd...) } func HxBeforeRequest(cmd ...Command) *LifeCycle { diff --git a/framework/h/xhr.go b/framework/h/xhr.go index 72f2ad0..1c707e1 100644 --- a/framework/h/xhr.go +++ b/framework/h/xhr.go @@ -1,6 +1,9 @@ package h -import "github.com/maddalax/htmgo/framework/hx" +import ( + "github.com/maddalax/htmgo/framework/hx" + "strings" +) func Get(path string, trigger ...string) *AttributeMapOrdered { return AttributeList(Attribute(hx.GetAttr, path), HxTriggerString(trigger...)) @@ -19,10 +22,18 @@ func GetWithQs(path string, qs *Qs, trigger string) *AttributeMapOrdered { } func PostPartial(partial PartialFunc, triggers ...string) *AttributeMapOrdered { - return Post(GetPartialPath(partial), triggers...) + path := GetPartialPath(partial) + if !strings.HasPrefix(path, "/") { + path = "/" + path + } + return Post(path, triggers...) } func PostPartialWithQs(partial PartialFunc, qs *Qs, trigger ...string) *AttributeMapOrdered { + path := GetPartialPathWithQs(partial, qs) + if !strings.HasPrefix(path, "/") { + path = "/" + path + } return Post(GetPartialPathWithQs(partial, qs), trigger...) } diff --git a/framework/hx/htmx.go b/framework/hx/htmx.go index 7fc2c13..9ce7393 100644 --- a/framework/hx/htmx.go +++ b/framework/hx/htmx.go @@ -108,14 +108,12 @@ const ( XhrLoadEndEvent Event = "htmx:xhr:loadend" XhrLoadStartEvent Event = "htmx:xhr:loadstart" XhrProgressEvent Event = "htmx:xhr:progress" - BeforeWsSendEvent Event = "htmx:wsBeforeSend" - AfterWsSendEvent Event = "htmx:wsAfterSend" - WsConnectedEvent Event = "htmx:wsOpen" - WsConnectingEvent Event = "htmx:wsConnecting" - WsClosedEvent Event = "htmx:wsClose" - WsErrorEvent Event = "htmx:wsError" - WsBeforeMessageEvent Event = "htmx:wsBeforeMessage" - WsAfterMessageEvent Event = "htmx:wsAfterMessage" + SseConnectedEvent Event = "htmx:sseOpen" + SseConnectingEvent Event = "htmx:sseConnecting" + SseClosedEvent Event = "htmx:sseClose" + SseErrorEvent Event = "htmx:sseError" + SseBeforeMessageEvent Event = "htmx:sseBeforeMessage" + SseAfterMessageEvent Event = "htmx:sseAfterMessage" // RevealedEvent Misc Events RevealedEvent Event = "revealed" From ecb42207f1f13004e3b2af9978a2a74b50c39cd0 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 22:31:41 -0500 Subject: [PATCH 17/28] some fixes --- examples/chat/Dockerfile | 2 +- examples/chat/go.mod | 2 +- examples/chat/go.sum | 2 ++ framework/assets/dist/htmgo.js | 4 ++-- framework/assets/js/htmxextensions/sse.ts | 5 +++++ 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/examples/chat/Dockerfile b/examples/chat/Dockerfile index 72c37a4..c336569 100644 --- a/examples/chat/Dockerfile +++ b/examples/chat/Dockerfile @@ -14,7 +14,7 @@ RUN go mod download COPY . . # Build the Go binary for Linux -RUN CGO_ENABLED=0 GOPRIVATE=github.com/maddalax LOG_LEVEL=debug go run github.com/maddalax/htmgo/cli/htmgo@9a5b929877017f0b6705d819e85001e6e2627dbf build +RUN CGO_ENABLED=0 GOPRIVATE=github.com/maddalax LOG_LEVEL=debug go run github.com/maddalax/htmgo/cli/htmgo@8b816e956692683337d9fff6416ccc31f5047b59 build RUN CGO_ENABLED=1 GOOS=linux go build -o ./dist -a -ldflags '-linkmode external -extldflags "-static"' . diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 17324de..15fbf0d 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -6,7 +6,7 @@ require ( github.com/coder/websocket v1.8.12 github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241001184532-9a5b92987701 + github.com/maddalax/htmgo/framework v0.0.0-20241002032603-8b816e956692 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index a2ec01f..c29b6fa 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -8,6 +8,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/maddalax/htmgo/framework v0.0.0-20241001184532-9a5b92987701 h1:0Zk282axc1kPiuspLNzK5BJV7cQ5h2kPZHe54dznhYY= github.com/maddalax/htmgo/framework v0.0.0-20241001184532-9a5b92987701/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241002032603-8b816e956692 h1:NtLJ7GcD9hWvPYmombxC1SzVNgvnhLXWhZEQJZOstik= +github.com/maddalax/htmgo/framework v0.0.0-20241002032603-8b816e956692/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index a9fd1ab..d691193 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var ee=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},P=getClosestAttributeValue(n,"hx-prompt");if(P){var I=prompt(P);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,N=v.formData;o.values&&overrideFormData(N,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(N,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),J=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:J,useUrlParams:F,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,F=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let G=t.split("#"),K=G[0],j=G[1],D=t;if(F&&(D=K,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:J,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let Z=F?null:encodeParamsForBody(m,n,L);return m.send(Z),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=ee;function te(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=re(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=ie(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&Y(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return Y(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,k,se="hx-target-";function $(e,t){return e.substring(0,t.length)===t}function ae(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];($(n,"4")||$(n,"5"))&&r.push("error");for(let o=0;o{k=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=ae(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,le());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function le(){window.location.reload();}var ue=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&ce(t.target);}});function ce(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ue)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var B=null,Q=new Set;h.defineExtension("sse",{init:function(e){B=e;},onEvent:function(e,t){if(t.target instanceof HTMLElement&&e==="htmx:beforeProcessNode"){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!Q.has(i)&&(fe(o,i),Q.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.onopen=function(r){console.log("EventSource open:",r),h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){console.log("EventSource message:",r.data),h.trigger(e,"htmx:sseBeforeMessage",{event:r});let o=r.data,i=B.makeFragment(o),s=Array.from(i.children);for(let l of s)B.oobSwap(B.getAttributeValue(l,"hx-swap-oob")||"true",l,{tasks:[]}),l.tagName==="SCRIPT"&&l.id.startsWith("__eval")&&document.body.appendChild(l);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},P=getClosestAttributeValue(n,"hx-prompt");if(P){var I=prompt(P);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,N=v.formData;o.values&&overrideFormData(N,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(N,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:F,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,F=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(F&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=F?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,k,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{k=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var B=null,K=new Set;h.defineExtension("sse",{init:function(e){B=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.onopen=function(r){console.log("EventSource open:",r),h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){console.log("EventSource message:",r.data),h.trigger(e,"htmx:sseBeforeMessage",{event:r});let o=r.data,i=B.makeFragment(o),s=Array.from(i.children);for(let l of s)B.oobSwap(B.getAttributeValue(l,"hx-swap-oob")||"true",l,{tasks:[]}),l.tagName==="SCRIPT"&&l.id.startsWith("__eval")&&document.body.appendChild(l);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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YSxDQUFFLENBQ3pELEVBRUosQ0FDRixDQUFDLEVBQ0giLCJmaWxlIjoiaHRtZ28uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaHRteCA9IChmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnXG5cbiAgLy8gUHVibGljIEFQSVxuICBjb25zdCBodG14ID0ge1xuICAgIC8vIFRzYyBtYWRuZXNzIGhlcmUsIGFzc2lnbmluZyB0aGUgZnVuY3Rpb25zIGRpcmVjdGx5IHJlc3VsdHMgaW4gYW4gaW52YWxpZCBUeXBlU2NyaXB0IG91dHB1dCwgYnV0IHJlYXNzaWduaW5nIGlzIGZpbmVcbiAgICAvKiBFdmVudCBwcm9jZXNzaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygb25Mb2FkSGVscGVyfSAqL1xuICAgIG9uTG9hZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwcm9jZXNzTm9kZX0gKi9cbiAgICBwcm9jZXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZEV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9mZjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0cmlnZ2VyRXZlbnR9ICovXG4gICAgdHJpZ2dlcjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhamF4SGVscGVyfSAqL1xuICAgIGFqYXg6IG51bGwsXG4gICAgLyogRE9NIHF1ZXJ5aW5nIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kfSAqL1xuICAgIGZpbmQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZEFsbH0gKi9cbiAgICBmaW5kQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGNsb3Nlc3R9ICovXG4gICAgY2xvc2VzdDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbnB1dCB2YWx1ZXMgdGhhdCB3b3VsZCByZXNvbHZlIGZvciBhIGdpdmVuIGVsZW1lbnQgdmlhIHRoZSBodG14IHZhbHVlIHJlc29sdXRpb24gbWVjaGFuaXNtXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN2YWx1ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0IHRoZSBlbGVtZW50IHRvIHJlc29sdmUgdmFsdWVzIG9uXG4gICAgICogQHBhcmFtIHtIdHRwVmVyYn0gdHlwZSB0aGUgcmVxdWVzdCB0eXBlIChlLmcuICoqZ2V0Kiogb3IgKipwb3N0KiopIG5vbi1HRVQncyB3aWxsIGluY2x1ZGUgdGhlIGVuY2xvc2luZyBmb3JtIG9mIHRoZSBlbGVtZW50LiBEZWZhdWx0cyB0byAqKnBvc3QqKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgdmFsdWVzOiBmdW5jdGlvbihlbHQsIHR5cGUpIHtcbiAgICAgIGNvbnN0IGlucHV0VmFsdWVzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB0eXBlIHx8ICdwb3N0JylcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlcy52YWx1ZXNcbiAgICB9LFxuICAgIC8qIERPTSBtYW5pcHVsYXRpb24gaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZENsYXNzVG9FbGVtZW50fSAqL1xuICAgIGFkZENsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdG9nZ2xlQ2xhc3NPbkVsZW1lbnR9ICovXG4gICAgdG9nZ2xlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdGFrZUNsYXNzRm9yRWxlbWVudH0gKi9cbiAgICB0YWtlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygc3dhcH0gKi9cbiAgICBzd2FwOiBudWxsLFxuICAgIC8qIEV4dGVuc2lvbiBlbnRyeXBvaW50cyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGRlZmluZUV4dGVuc2lvbn0gKi9cbiAgICBkZWZpbmVFeHRlbnNpb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXh0ZW5zaW9ufSAqL1xuICAgIHJlbW92ZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dBbGx9ICovXG4gICAgbG9nQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ05vbmV9ICovXG4gICAgbG9nTm9uZTogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKipcbiAgICAgKiBUaGUgbG9nZ2VyIGh0bXggdXNlcyB0byBsb2cgd2l0aFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nZ2VyXG4gICAgICovXG4gICAgbG9nZ2VyOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHkgaG9sZGluZyB0aGUgY29uZmlndXJhdGlvbiBodG14IHVzZXMgYXQgcnVudGltZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB1c2luZyBhIFttZXRhIHRhZ10oaHR0cHM6Ly9odG14Lm9yZy9kb2NzLyNjb25maWcpIGlzIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHRoZXNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjb25maWdcbiAgICAgKi9cbiAgICBjb25maWc6IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byB1c2UgaGlzdG9yeS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUVuYWJsZWQ6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8ga2VlcCBpbiAqKmxvY2FsU3RvcmFnZSoqIGZvciBoaXN0b3J5IHN1cHBvcnQuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlDYWNoZVNpemU6IDEwLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICByZWZyZXNoT25IaXN0b3J5TWlzczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IHN3YXAgc3R5bGUgdG8gdXNlIGlmICoqW2h4LXN3YXBdKGh0dHBzOi8vaHRteC5vcmcvYXR0cmlidXRlcy9oeC1zd2FwKSoqIGlzIG9taXR0ZWQuXG4gICAgICAgKiBAdHlwZSBIdG14U3dhcFN0eWxlXG4gICAgICAgKiBAZGVmYXVsdCAnaW5uZXJIVE1MJ1xuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcFN0eWxlOiAnaW5uZXJIVE1MJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiByZWNlaXZpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGRvaW5nIHRoZSBzd2FwLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwRGVsYXk6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gY29tcGxldGluZyB0aGUgY29udGVudCBzd2FwIGFuZCBzZXR0bGluZyBhdHRyaWJ1dGVzLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U2V0dGxlRGVsYXk6IDIwLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0cnVlLCBodG14IHdpbGwgaW5qZWN0IGEgc21hbGwgYW1vdW50IG9mIENTUyBpbnRvIHRoZSBwYWdlIHRvIG1ha2UgaW5kaWNhdG9ycyBpbnZpc2libGUgdW5sZXNzIHRoZSAqKmh0bXgtaW5kaWNhdG9yKiogY2xhc3MgaXMgcHJlc2VudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaW5jbHVkZUluZGljYXRvclN0eWxlczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIGluZGljYXRvcnMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1pbmRpY2F0b3InXG4gICAgICAgKi9cbiAgICAgIGluZGljYXRvckNsYXNzOiAnaHRteC1pbmRpY2F0b3InLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdHJpZ2dlcmluZyBlbGVtZW50cyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXJlcXVlc3QnXG4gICAgICAgKi9cbiAgICAgIHJlcXVlc3RDbGFzczogJ2h0bXgtcmVxdWVzdCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byB0ZW1wb3JhcmlseSBwbGFjZSBvbiBlbGVtZW50cyB0aGF0IGh0bXggaGFzIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWFkZGVkJ1xuICAgICAgICovXG4gICAgICBhZGRlZENsYXNzOiAnaHRteC1hZGRlZCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc2V0dGxpbmcnXG4gICAgICAgKi9cbiAgICAgIHNldHRsaW5nQ2xhc3M6ICdodG14LXNldHRsaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHN3YXBwaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zd2FwcGluZydcbiAgICAgICAqL1xuICAgICAgc3dhcHBpbmdDbGFzczogJ2h0bXgtc3dhcHBpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvd3MgdGhlIHVzZSBvZiBldmFsLWxpa2UgZnVuY3Rpb25hbGl0eSBpbiBodG14LCB0byBlbmFibGUgKipoeC12YXJzKiosIHRyaWdnZXIgY29uZGl0aW9ucyAmIHNjcmlwdCB0YWcgZXZhbHVhdGlvbi4gQ2FuIGJlIHNldCB0byAqKmZhbHNlKiogZm9yIENTUCBjb21wYXRpYmlsaXR5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd0V2YWw6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byBmYWxzZSwgZGlzYWJsZXMgdGhlIGludGVycHJldGF0aW9uIG9mIHNjcmlwdCB0YWdzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd1NjcmlwdFRhZ3M6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHNjcmlwdHMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVNjcmlwdE5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc3R5bGVzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTdHlsZU5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGF0dHJpYnV0ZXMgdG8gc2V0dGxlIGR1cmluZyB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgICAgICogQGRlZmF1bHQgWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXVxuICAgICAgICovXG4gICAgICBhdHRyaWJ1dGVzVG9TZXR0bGU6IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93IGNyb3NzLXNpdGUgQWNjZXNzLUNvbnRyb2wgcmVxdWVzdHMgdXNpbmcgY3JlZGVudGlhbHMgc3VjaCBhcyBjb29raWVzLCBhdXRob3JpemF0aW9uIGhlYWRlcnMgb3IgVExTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgdGltZW91dDogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgKipnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheSoqIGZvciByZWNvbm5lY3RpbmcgYWZ0ZXIgdW5leHBlY3RlZCBjb25uZWN0aW9uIGxvc3MgYnkgdGhlIGV2ZW50IGNvZGUgKipBYm5vcm1hbCBDbG9zdXJlKiosICoqU2VydmljZSBSZXN0YXJ0Kiogb3IgKipUcnkgQWdhaW4gTGF0ZXIqKi5cbiAgICAgICAqIEB0eXBlIHsnZnVsbC1qaXR0ZXInIHwgKChyZXRyeUNvdW50Om51bWJlcikgPT4gbnVtYmVyKX1cbiAgICAgICAqIEBkZWZhdWx0IFwiZnVsbC1qaXR0ZXJcIlxuICAgICAgICovXG4gICAgICB3c1JlY29ubmVjdERlbGF5OiAnZnVsbC1qaXR0ZXInLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdHlwZSBvZiBiaW5hcnkgZGF0YSBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICogQHR5cGUgQmluYXJ5VHlwZVxuICAgICAgICogQGRlZmF1bHQgJ2Jsb2InXG4gICAgICAgKi9cbiAgICAgIHdzQmluYXJ5VHlwZTogJ2Jsb2InLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJ1xuICAgICAgICovXG4gICAgICBkaXNhYmxlU2VsZWN0b3I6ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgeydhdXRvJyB8ICdpbnN0YW50JyB8ICdzbW9vdGgnfVxuICAgICAgICogQGRlZmF1bHQgJ2luc3RhbnQnXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoZSBmb2N1c2VkIGVsZW1lbnQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdmlldy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRGb2N1c1Njcm9sbDogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBpbmNsdWRlIGEgY2FjaGUtYnVzdGluZyBwYXJhbWV0ZXIgaW4gR0VUIHJlcXVlc3RzIHRvIGF2b2lkIGNhY2hpbmcgcGFydGlhbCByZXNwb25zZXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdldENhY2hlQnVzdGVyUGFyYW06IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgaHRteCB3aWxsIHVzZSB0aGUgVmlldyBUcmFuc2l0aW9uIEFQSSB3aGVuIHN3YXBwaW5nIGluIG5ldyBjb250ZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2xvYmFsVmlld1RyYW5zaXRpb25zOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogaHRteCB3aWxsIGZvcm1hdCByZXF1ZXN0cyB3aXRoIHRoZXNlIG1ldGhvZHMgYnkgZW5jb2RpbmcgdGhlaXIgcGFyYW1ldGVycyBpbiB0aGUgVVJMLCBub3QgdGhlIHJlcXVlc3QgYm9keVxuICAgICAgICogQHR5cGUgeyhIdHRwVmVyYilbXX1cbiAgICAgICAqIEBkZWZhdWx0IFsnZ2V0JywgJ2RlbGV0ZSddXG4gICAgICAgKi9cbiAgICAgIG1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zOiBbJ2dldCcsICdkZWxldGUnXSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGRpc2FibGVzIGh0bXgtYmFzZWQgcmVxdWVzdHMgdG8gbm9uLW9yaWdpbiBob3N0cy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHNlbGZSZXF1ZXN0c09ubHk6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBub3QgdXBkYXRlIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQgd2hlbiBhIHRpdGxlIHRhZyBpcyBmb3VuZCBpbiBuZXcgY29udGVudFxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgaWdub3JlVGl0bGU6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgb2YgYSBib29zdGVkIGVsZW1lbnQgaXMgc2Nyb2xsZWQgaW50byB0aGUgdmlld3BvcnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEludG9WaWV3T25Cb29zdDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNhY2hlIHRvIHN0b3JlIGV2YWx1YXRlZCB0cmlnZ2VyIHNwZWNpZmljYXRpb25zIGludG8uXG4gICAgICAgKiBZb3UgbWF5IGRlZmluZSBhIHNpbXBsZSBvYmplY3QgdG8gdXNlIGEgbmV2ZXItY2xlYXJpbmcgY2FjaGUsIG9yIGltcGxlbWVudCB5b3VyIG93biBzeXN0ZW0gdXNpbmcgYSBbcHJveHkgb2JqZWN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSlcbiAgICAgICAqIEB0eXBlIHtPYmplY3R8bnVsbH1cbiAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAqL1xuICAgICAgdHJpZ2dlclNwZWNzQ2FjaGU6IG51bGwsXG4gICAgICAvKiogQHR5cGUgYm9vbGVhbiAqL1xuICAgICAgZGlzYWJsZUluaGVyaXRhbmNlOiBmYWxzZSxcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1tdICovXG4gICAgICByZXNwb25zZUhhbmRsaW5nOiBbXG4gICAgICAgIHsgY29kZTogJzIwNCcsIHN3YXA6IGZhbHNlIH0sXG4gICAgICAgIHsgY29kZTogJ1syM10uLicsIHN3YXA6IHRydWUgfSxcbiAgICAgICAgeyBjb2RlOiAnWzQ1XS4uJywgc3dhcDogZmFsc2UsIGVycm9yOiB0cnVlIH1cbiAgICAgIF0sXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gcHJvY2VzcyBPT0Igc3dhcHMgb24gZWxlbWVudHMgdGhhdCBhcmUgbmVzdGVkIHdpdGhpbiB0aGUgbWFpbiByZXNwb25zZSBlbGVtZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd05lc3RlZE9vYlN3YXBzOiB0cnVlXG4gICAgfSxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwYXJzZUludGVydmFsfSAqL1xuICAgIHBhcnNlSW50ZXJ2YWw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgaW50ZXJuYWxFdmFsfSAqL1xuICAgIF86IG51bGwsXG4gICAgdmVyc2lvbjogJzIuMC4yJ1xuICB9XG4gIC8vIFRzYyBtYWRuZXNzIHBhcnQgMlxuICBodG14Lm9uTG9hZCA9IG9uTG9hZEhlbHBlclxuICBodG14LnByb2Nlc3MgPSBwcm9jZXNzTm9kZVxuICBodG14Lm9uID0gYWRkRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC5vZmYgPSByZW1vdmVFdmVudExpc3RlbmVySW1wbFxuICBodG14LnRyaWdnZXIgPSB0cmlnZ2VyRXZlbnRcbiAgaHRteC5hamF4ID0gYWpheEhlbHBlclxuICBodG14LmZpbmQgPSBmaW5kXG4gIGh0bXguZmluZEFsbCA9IGZpbmRBbGxcbiAgaHRteC5jbG9zZXN0ID0gY2xvc2VzdFxuICBodG14LnJlbW92ZSA9IHJlbW92ZUVsZW1lbnRcbiAgaHRteC5hZGRDbGFzcyA9IGFkZENsYXNzVG9FbGVtZW50XG4gIGh0bXgucmVtb3ZlQ2xhc3MgPSByZW1vdmVDbGFzc0Zyb21FbGVtZW50XG4gIGh0bXgudG9nZ2xlQ2xhc3MgPSB0b2dnbGVDbGFzc09uRWxlbWVudFxuICBodG14LnRha2VDbGFzcyA9IHRha2VDbGFzc0ZvckVsZW1lbnRcbiAgaHRteC5zd2FwID0gc3dhcFxuICBodG14LmRlZmluZUV4dGVuc2lvbiA9IGRlZmluZUV4dGVuc2lvblxuICBodG14LnJlbW92ZUV4dGVuc2lvbiA9IHJlbW92ZUV4dGVuc2lvblxuICBodG14LmxvZ0FsbCA9IGxvZ0FsbFxuICBodG14LmxvZ05vbmUgPSBsb2dOb25lXG4gIGh0bXgucGFyc2VJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWxcbiAgaHRteC5fID0gaW50ZXJuYWxFdmFsXG5cbiAgY29uc3QgaW50ZXJuYWxBUEkgPSB7XG4gICAgYWRkVHJpZ2dlckhhbmRsZXIsXG4gICAgYm9keUNvbnRhaW5zLFxuICAgIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSxcbiAgICBmaW5kVGhpc0VsZW1lbnQsXG4gICAgZmlsdGVyVmFsdWVzLFxuICAgIHN3YXAsXG4gICAgaGFzQXR0cmlidXRlLFxuICAgIGdldEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0TWF0Y2gsXG4gICAgZ2V0RXhwcmVzc2lvblZhcnMsXG4gICAgZ2V0SGVhZGVycyxcbiAgICBnZXRJbnB1dFZhbHVlcyxcbiAgICBnZXRJbnRlcm5hbERhdGEsXG4gICAgZ2V0U3dhcFNwZWNpZmljYXRpb24sXG4gICAgZ2V0VHJpZ2dlclNwZWNzLFxuICAgIGdldFRhcmdldCxcbiAgICBtYWtlRnJhZ21lbnQsXG4gICAgbWVyZ2VPYmplY3RzLFxuICAgIG1ha2VTZXR0bGVJbmZvLFxuICAgIG9vYlN3YXAsXG4gICAgcXVlcnlTZWxlY3RvckV4dCxcbiAgICBzZXR0bGVJbW1lZGlhdGVseSxcbiAgICBzaG91bGRDYW5jZWwsXG4gICAgdHJpZ2dlckV2ZW50LFxuICAgIHRyaWdnZXJFcnJvckV2ZW50LFxuICAgIHdpdGhFeHRlbnNpb25zXG4gIH1cblxuICBjb25zdCBWRVJCUyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCddXG4gIGNvbnN0IFZFUkJfU0VMRUNUT1IgPSBWRVJCUy5tYXAoZnVuY3Rpb24odmVyYikge1xuICAgIHJldHVybiAnW2h4LScgKyB2ZXJiICsgJ10sIFtkYXRhLWh4LScgKyB2ZXJiICsgJ10nXG4gIH0pLmpvaW4oJywgJylcblxuICBjb25zdCBIRUFEX1RBR19SRUdFWCA9IG1ha2VUYWdSZWdFeCgnaGVhZCcpXG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXRpbGl0aWVzXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge1JlZ0V4cH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VUYWdSZWdFeCh0YWcsIGdsb2JhbCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYDwke3RhZ30oXFxcXHNbXj5dKj58PikoW1xcXFxzXFxcXFNdKj8pPFxcXFwvJHt0YWd9PmAsXG4gICAgICBnbG9iYWwgPyAnZ2ltJyA6ICdpbScpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIGludGVydmFsIHN0cmluZyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBodG14IGRvZXMuIFVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IGhhdmUgdGltaW5nLXJlbGF0ZWQgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQ2F1dGlvbjogQWNjZXB0cyBhbiBpbnQgZm9sbG93ZWQgYnkgZWl0aGVyICoqcyoqIG9yICoqbXMqKi4gQWxsIG90aGVyIHZhbHVlcyB1c2UgKipwYXJzZUZsb2F0KipcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcGFyc2VJbnRlcnZhbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRpbWluZyBzdHJpbmdcbiAgICogQHJldHVybnMge251bWJlcnx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUludGVydmFsKHN0cikge1xuICAgIGlmIChzdHIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgbGV0IGludGVydmFsID0gTmFOXG4gICAgaWYgKHN0ci5zbGljZSgtMikgPT0gJ21zJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMikpXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdzJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMFxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAnbScpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDAgKiA2MFxuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNOYU4oaW50ZXJ2YWwpID8gdW5kZWZpbmVkIDogaW50ZXJ2YWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmF3QXR0cmlidXRlKGVsdCwgbmFtZSkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGVsdC5nZXRBdHRyaWJ1dGUobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIC8vIHJlc29sdmUgd2l0aCBib3RoIGh4IGFuZCBkYXRhLWh4IHByZWZpeGVzXG4gIGZ1bmN0aW9uIGhhc0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gISFlbHQuaGFzQXR0cmlidXRlICYmIChlbHQuaGFzQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpIHx8XG4gICAgICBlbHQuaGFzQXR0cmlidXRlKCdkYXRhLScgKyBxdWFsaWZpZWROYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuIGdldFJhd0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHx8IGdldFJhd0F0dHJpYnV0ZShlbHQsICdkYXRhLScgKyBxdWFsaWZpZWROYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudEVsdChlbHQpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIGlmICghcGFyZW50ICYmIGVsdC5wYXJlbnROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkgcmV0dXJuIGVsdC5wYXJlbnROb2RlXG4gICAgcmV0dXJuIHBhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICAgIHJldHVybiBkb2N1bWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtOb2RlfERvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Um9vdE5vZGUoZWx0LCBnbG9iYWwpIHtcbiAgICByZXR1cm4gZWx0LmdldFJvb3ROb2RlID8gZWx0LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IGdsb2JhbCB9KSA6IGdldERvY3VtZW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0geyhlOk5vZGUpID0+IGJvb2xlYW59IGNvbmRpdGlvblxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0TWF0Y2goZWx0LCBjb25kaXRpb24pIHtcbiAgICB3aGlsZSAoZWx0ICYmICFjb25kaXRpb24oZWx0KSkge1xuICAgICAgZWx0ID0gcGFyZW50RWx0KGVsdClcbiAgICB9XG5cbiAgICByZXR1cm4gZWx0IHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGluaXRpYWxFbGVtZW50XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gYW5jZXN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoaW5pdGlhbEVsZW1lbnQsIGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBkaXNpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1kaXNpbmhlcml0JylcbiAgICB2YXIgaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtaW5oZXJpdCcpXG4gICAgaWYgKGluaXRpYWxFbGVtZW50ICE9PSBhbmNlc3Rvcikge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmRpc2FibGVJbmhlcml0YW5jZSkge1xuICAgICAgICBpZiAoaW5oZXJpdCAmJiAoaW5oZXJpdCA9PT0gJyonIHx8IGluaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpc2luaGVyaXQgJiYgKGRpc2luaGVyaXQgPT09ICcqJyB8fCBkaXNpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICByZXR1cm4gJ3Vuc2V0J1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBsZXQgY2xvc2VzdEF0dHIgPSBudWxsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuICEhKGNsb3Nlc3RBdHRyID0gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoZWx0LCBhc0VsZW1lbnQoZSksIGF0dHJpYnV0ZU5hbWUpKVxuICAgIH0pXG4gICAgaWYgKGNsb3Nlc3RBdHRyICE9PSAndW5zZXQnKSB7XG4gICAgICByZXR1cm4gY2xvc2VzdEF0dHJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMgZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRWYXJpYWJsZVxuICAgIGNvbnN0IG1hdGNoZXNGdW5jdGlvbiA9IGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgKGVsdC5tYXRjaGVzIHx8IGVsdC5tYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWx0LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbHQub01hdGNoZXNTZWxlY3RvcilcbiAgICByZXR1cm4gISFtYXRjaGVzRnVuY3Rpb24gJiYgbWF0Y2hlc0Z1bmN0aW9uLmNhbGwoZWx0LCBzZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdGFydFRhZyhzdHIpIHtcbiAgICBjb25zdCB0YWdNYXRjaGVyID0gLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pXG4gICAgY29uc3QgbWF0Y2ggPSB0YWdNYXRjaGVyLmV4ZWMoc3RyKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSFRNTChyZXNwKSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpXG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcCwgJ3RleHQvaHRtbCcpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBlbHQpIHtcbiAgICB3aGlsZSAoZWx0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsdC5jaGlsZE5vZGVzWzBdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge0hUTUxTY3JpcHRFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZHVwbGljYXRlU2NyaXB0KHNjcmlwdCkge1xuICAgIGNvbnN0IG5ld1NjcmlwdCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICBmb3JFYWNoKHNjcmlwdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBuZXdTY3JpcHQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICB9KVxuICAgIG5ld1NjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdC50ZXh0Q29udGVudFxuICAgIG5ld1NjcmlwdC5hc3luYyA9IGZhbHNlXG4gICAgaWYgKGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlKSB7XG4gICAgICBuZXdTY3JpcHQubm9uY2UgPSBodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZVxuICAgIH1cbiAgICByZXR1cm4gbmV3U2NyaXB0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpIHtcbiAgICByZXR1cm4gc2NyaXB0Lm1hdGNoZXMoJ3NjcmlwdCcpICYmIChzY3JpcHQudHlwZSA9PT0gJ3RleHQvamF2YXNjcmlwdCcgfHwgc2NyaXB0LnR5cGUgPT09ICdtb2R1bGUnIHx8IHNjcmlwdC50eXBlID09PSAnJylcbiAgfVxuXG4gIC8qKlxuICAgKiB3ZSBoYXZlIHRvIG1ha2UgbmV3IGNvcGllcyBvZiBzY3JpcHQgdGFncyB0aGF0IHdlIGFyZSBnb2luZyB0byBpbnNlcnQgYmVjYXVzZVxuICAgKiBTT01FIGJyb3dzZXJzIChub3Qgc2F5aW5nIHdobywgYnV0IGl0IGludm9sdmVzIGFuIGVsZW1lbnQgYW5kIGFuIGFuaW1hbCkgZG9uJ3RcbiAgICogZXhlY3V0ZSBzY3JpcHRzIGNyZWF0ZWQgaW4gPHRlbXBsYXRlPiB0YWdzIHdoZW4gdGhleSBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXG4gICAqIGFuZCBhbGwgdGhlIG90aGVycyBkbyBsbWFvXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpIHtcbiAgICBBcnJheS5mcm9tKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpKS5mb3JFYWNoKC8qKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHQgKi8gKHNjcmlwdCkgPT4ge1xuICAgICAgaWYgKGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSkge1xuICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBzY3JpcHQucGFyZW50Tm9kZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3U2NyaXB0LCBzY3JpcHQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7RG9jdW1lbnRGcmFnbWVudCAmIHt0aXRsZT86IHN0cmluZ319IERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGVcbiAgICogQGRlc2NyaXB0aW9uICBhIGRvY3VtZW50IGZyYWdtZW50IHJlcHJlc2VudGluZyB0aGUgcmVzcG9uc2UgSFRNTCwgaW5jbHVkaW5nXG4gICAqIGEgYHRpdGxlYCBwcm9wZXJ0eSBmb3IgYW55IHRpdGxlIGluZm9ybWF0aW9uIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2UgSFRNTFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VGcmFnbWVudChyZXNwb25zZSkge1xuICAgIC8vIHN0cmlwIGhlYWQgdGFnIHRvIGRldGVybWluZSBzaGFwZSBvZiByZXNwb25zZSB3ZSBhcmUgZGVhbGluZyB3aXRoXG4gICAgY29uc3QgcmVzcG9uc2VXaXRoTm9IZWFkID0gcmVzcG9uc2UucmVwbGFjZShIRUFEX1RBR19SRUdFWCwgJycpXG4gICAgY29uc3Qgc3RhcnRUYWcgPSBnZXRTdGFydFRhZyhyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi9cbiAgICBsZXQgZnJhZ21lbnRcbiAgICBpZiAoc3RhcnRUYWcgPT09ICdodG1sJykge1xuICAgICAgLy8gaWYgaXQgaXMgYSBmdWxsIGRvY3VtZW50LCBwYXJzZSBpdCBhbmQgcmV0dXJuIHRoZSBib2R5XG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIGlmIChzdGFydFRhZyA9PT0gJ2JvZHknKSB7XG4gICAgICAvLyBwYXJzZSBib2R5IHcvbyB3cmFwcGluZyBpbiB0ZW1wbGF0ZVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgbm9uLWJvZHkgcGFydGlhbCBIVE1MIGNvbnRlbnQsIHNvIHdyYXAgaXQgaW4gYSB0ZW1wbGF0ZSB0byBtYXhpbWl6ZSBwYXJzaW5nIGZsZXhpYmlsaXR5XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwoJzxib2R5Pjx0ZW1wbGF0ZSBjbGFzcz1cImludGVybmFsLWh0bXgtd3JhcHBlclwiPicgKyByZXNwb25zZVdpdGhOb0hlYWQgKyAnPC90ZW1wbGF0ZT48L2JvZHk+JylcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKGRvYy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpLmNvbnRlbnQpXG4gICAgICAvLyBleHRyYWN0IHRpdGxlIGludG8gZnJhZ21lbnQgZm9yIGxhdGVyIHByb2Nlc3NpbmdcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG5cbiAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyB3ZSBzdXBwb3J0IGEgdGl0bGUgdGFnIGF0IHRoZSByb290IGxldmVsIG9mIG5vbi1ib2R5IHJlc3BvbnNlcywgc28gd2UgbmVlZCB0byBoYW5kbGUgaXRcbiAgICAgIHZhciB0aXRsZUVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbGVtZW50ICYmIHRpdGxlRWxlbWVudC5wYXJlbnROb2RlID09PSBmcmFnbWVudCkge1xuICAgICAgICB0aXRsZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgICAgZnJhZ21lbnQudGl0bGUgPSB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93U2NyaXB0VGFncykge1xuICAgICAgICBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBzY3JpcHQgdGFncyBpZiBzY3JpcHRzIGFyZSBkaXNhYmxlZFxuICAgICAgICBmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKS5mb3JFYWNoKChzY3JpcHQpID0+IHNjcmlwdC5yZW1vdmUoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVDYWxsKGZ1bmMpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgZnVuYygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBpc1R5cGUobywgdHlwZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIEZ1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIE9iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUmF3T2JqZWN0KG8pIHtcbiAgICByZXR1cm4gaXNUeXBlKG8sICdPYmplY3QnKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9uSGFuZGxlclxuICAgKiBAcHJvcGVydHkgeyhrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwKXxzdHJpbmd9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RlbmVySW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IG9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14Tm9kZUludGVybmFsRGF0YVxuICAgKiBFbGVtZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbml0SGFzaF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYm9vc3RlZF1cbiAgICogQHByb3BlcnR5IHtPbkhhbmRsZXJbXX0gW29uSGFuZGxlcnNdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHByb3BlcnR5IHtMaXN0ZW5lckluZm9bXX0gW2xpc3RlbmVySW5mb3NdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhbmNlbGxlZF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdHJpZ2dlcmVkT25jZV1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheWVkXVxuICAgKiBAcHJvcGVydHkge251bWJlcnxudWxsfSBbdGhyb3R0bGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFzdFZhbHVlXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2FkZWRdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJiXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwb2xsaW5nXVxuICAgKiBAcHJvcGVydHkge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8bnVsbH0gW2xhc3RCdXR0b25DbGlja2VkXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3JlcXVlc3RDb3VudF1cbiAgICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0gW3hocl1cbiAgICogQHByb3BlcnR5IHsoKCkgPT4gdm9pZClbXX0gW3F1ZXVlZFJlcXVlc3RzXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthYm9ydGFibGVdXG4gICAqXG4gICAqIEV2ZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IFt0cmlnZ2VyU3BlY11cbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldFtdfSBbaGFuZGxlZEZvcl1cbiAgICovXG5cbiAgLyoqXG4gICAqIGdldEludGVybmFsRGF0YSByZXRyaWV2ZXMgXCJwcml2YXRlXCIgZGF0YSBzdG9yZWQgYnkgaHRteCB3aXRoaW4gYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEV2ZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxEYXRhKGVsdCkge1xuICAgIGNvbnN0IGRhdGFQcm9wID0gJ2h0bXgtaW50ZXJuYWwtZGF0YSdcbiAgICBsZXQgZGF0YSA9IGVsdFtkYXRhUHJvcF1cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGRhdGEgPSBlbHRbZGF0YVByb3BdID0ge31cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0FycmF5IGNvbnZlcnRzIGFuIEFycmF5TGlrZSBvYmplY3QgaW50byBhIHJlYWwgYXJyYXkuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHJldHVybnMge1RbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkoYXJyKSB7XG4gICAgY29uc3QgcmV0dXJuQXJyID0gW11cbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXR1cm5BcnIucHVzaChhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5BcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1RbXXxOYW1lZE5vZGVNYXB8SFRNTENvbGxlY3Rpb258SFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb258QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHBhcmFtIHsoVCkgPT4gdm9pZH0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gZm9yRWFjaChhcnIsIGZ1bmMpIHtcbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBmdW5jKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsZWRJbnRvVmlldyhlbCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGVsZW1Ub3AgPSByZWN0LnRvcFxuICAgIGNvbnN0IGVsZW1Cb3R0b20gPSByZWN0LmJvdHRvbVxuICAgIHJldHVybiBlbGVtVG9wIDwgd2luZG93LmlubmVySGVpZ2h0ICYmIGVsZW1Cb3R0b20gPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gYm9keUNvbnRhaW5zKGVsdCkge1xuICAgIC8vIElFIEZpeFxuICAgIGNvbnN0IHJvb3ROb2RlID0gZWx0LmdldFJvb3ROb2RlICYmIGVsdC5nZXRSb290Tm9kZSgpXG4gICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QpIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMocm9vdE5vZGUuaG9zdClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHNwbGl0T25XaGl0ZXNwYWNlKHRyaWdnZXIpIHtcbiAgICByZXR1cm4gdHJpZ2dlci50cmltKCkuc3BsaXQoL1xccysvKVxuICB9XG5cbiAgLyoqXG4gICAqIG1lcmdlT2JqZWN0cyB0YWtlcyBhbGwgdGhlIGtleXMgZnJvbVxuICAgKiBvYmoyIGFuZCBkdXBsaWNhdGVzIHRoZW0gaW50byBvYmoxXG4gICAqIEB0ZW1wbGF0ZSBUMVxuICAgKiBAdGVtcGxhdGUgVDJcbiAgICogQHBhcmFtIHtUMX0gb2JqMVxuICAgKiBAcGFyYW0ge1QyfSBvYmoyXG4gICAqIEByZXR1cm5zIHtUMSAmIFQyfVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmoyKSB7XG4gICAgICBpZiAob2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgcmV0dXJuIG9iajFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30galN0cmluZ1xuICAgKiBAcmV0dXJucyB7YW55fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUpTT04oalN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShqU3RyaW5nKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dFcnJvcihlcnJvcilcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkge1xuICAgIGNvbnN0IHRlc3QgPSAnaHRteDpsb2NhbFN0b3JhZ2VUZXN0J1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KVxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoKVxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBwYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCB1bmxlc3MgaW5kZXggcGFnZVxuICAgICAgaWYgKCEoL15cXC8kLy50ZXN0KHBhdGgpKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBiZSBraW5kIHRvIElFMTEsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBVUkwoKVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHVibGljIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gaW50ZXJuYWxFdmFsKHN0cikge1xuICAgIHJldHVybiBtYXliZUV2YWwoZ2V0RG9jdW1lbnQoKS5ib2R5LCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBldmFsKHN0cilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjYWxsYmFjayBmb3IgdGhlICoqaHRteDpsb2FkKiogZXZlbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvY2VzcyBuZXcgY29udGVudCwgZm9yIGV4YW1wbGUgaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50IHdpdGggYSBqYXZhc2NyaXB0IGxpYnJhcnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25Mb2FkXG4gICAqXG4gICAqIEBwYXJhbSB7KGVsdDogTm9kZSkgPT4gdm9pZH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGNhbGwgb24gbmV3bHkgbG9hZGVkIGNvbnRlbnRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvbkxvYWRIZWxwZXIoY2FsbGJhY2spIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0bXgub24oJ2h0bXg6bG9hZCcsIC8qKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldnQgKi8gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjYWxsYmFjayhldnQuZGV0YWlsLmVsdClcbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIExvZyBhbGwgaHRteCBldmVudHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dBbGxcbiAgICovXG4gIGZ1bmN0aW9uIGxvZ0FsbCgpIHtcbiAgICBodG14LmxvZ2dlciA9IGZ1bmN0aW9uKGVsdCwgZXZlbnQsIGRhdGEpIHtcbiAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LCBlbHQsIGRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nTm9uZSgpIHtcbiAgICBodG14LmxvZ2dlciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudCBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZEFsbFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudHMgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD59XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQWxsKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRBbGwoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgV2luZG93XG4gICAqL1xuICBmdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHdpbmRvd1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsdCwgZGVsYXkpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUVsZW1lbnQoZWx0KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RWx0KGVsdCkucmVtb3ZlQ2hpbGQoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0h0bWxFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqIEByZXR1cm4ge1BhcmVudE5vZGV8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzUGFyZW50Tm9kZShlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFkZHMgYSBjbGFzcyB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWRkQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgY2xhc3MgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byBhZGRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSBjbGFzcyBpcyBhZGRlZFxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eiwgZGVsYXkpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0LmNsYXNzTGlzdCAmJiBlbHQuY2xhc3NMaXN0LmFkZChjbGF6eilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsYXNzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gbm9kZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgY2xhc3MgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgY2xhc3MgaXMgcmVtb3ZlZClcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQobm9kZSwgY2xhenosIGRlbGF5KSB7XG4gICAgbGV0IGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KG5vZGUpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShjbGF6eilcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGNsYXNzZXMgbGVmdCwgcmVtb3ZlIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGdpdmVuIGNsYXNzIG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdG9nZ2xlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRvZ2dsZSB0aGUgY2xhc3Mgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0b2dnbGVcbiAgICovXG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzT25FbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBlbHQuY2xhc3NMaXN0LnRvZ2dsZShjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSBpdHMgc2libGluZ3MsIHNvIHRoYXQgYW1vbmcgaXRzIHNpYmxpbmdzLCBvbmx5IHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Rha2VDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRha2UgdGhlIGNsYXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdGFrZVxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNsYXNzRm9yRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZm9yRWFjaChlbHQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXp6KVxuICAgIH0pXG4gICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGVsdCksIGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjbG9zZXN0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzIHBhcmVudGFnZSwgaW5jbHVzaXZlIG9mIHRoZSBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2Nsb3Nlc3RcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIHNlbGVjdG9yIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBmaW5kXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZXN0KGVsdCwgc2VsZWN0b3IpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmIChlbHQgJiYgZWx0LmNsb3Nlc3QpIHtcbiAgICAgIHJldHVybiBlbHQuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyByZW1vdmUgd2hlbiBJRSBnb2VzIGF3YXlcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGVsdCA9PSBudWxsIHx8IG1hdGNoZXMoZWx0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbHQgPSBlbHQgJiYgYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSlcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwcmVmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzdWZmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgPT09IHN1ZmZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICBjb25zdCB0cmltbWVkU2VsZWN0b3IgPSBzZWxlY3Rvci50cmltKClcbiAgICBpZiAoc3RhcnRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICc8JykgJiYgZW5kc1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnLz4nKSkge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3Rvci5zdWJzdHJpbmcoMSwgdHJpbW1lZFNlbGVjdG9yLmxlbmd0aCAtIDIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfEVsZW1lbnR8RG9jdW1lbnR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLCBnbG9iYWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoc2VsZWN0b3IuaW5kZXhPZignY2xvc2VzdCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtjbG9zZXN0KGFzRWxlbWVudChlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOCkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2ZpbmQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbZmluZChhc1BhcmVudE5vZGUoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ25leHQnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLm5leHRFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ25leHQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkZvcndhcmRRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncHJldmlvdXMnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdwcmV2aW91cyAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuQmFja3dhcmRzUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudF1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnd2luZG93Jykge1xuICAgICAgcmV0dXJuIFt3aW5kb3ddXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2JvZHknKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50LmJvZHldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3Jvb3QnKSB7XG4gICAgICByZXR1cm4gW2dldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZ2xvYmFsICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLnNsaWNlKDcpLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdG9BcnJheShhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkZvcndhcmRRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5CYWNrd2FyZHNRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd31cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3RvcilbMF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZ2V0RG9jdW1lbnQoKS5ib2R5LCBlbHRPclNlbGVjdG9yKVswXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge0V2ZW50VGFyZ2V0fSBUXG4gICAqIEBwYXJhbSB7VHxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtUfSBbY29udGV4dF1cbiAgICogQHJldHVybnMge0VsZW1lbnR8VHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVRhcmdldChlbHRPclNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZpbmQoYXNQYXJlbnROb2RlKGNvbnRleHQpIHx8IGRvY3VtZW50LCBlbHRPclNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7a2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcHxzdHJpbmd9IEFueUV2ZW50TmFtZVxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXZlbnRBcmdzXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICAgKiBAcHJvcGVydHkge0FueUV2ZW50TmFtZX0gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxBbnlFdmVudE5hbWV9IGFyZzFcbiAgICogQHBhcmFtIHtBbnlFdmVudE5hbWV8RXZlbnRMaXN0ZW5lcn0gYXJnMlxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXVxuICAgKiBAcmV0dXJucyB7RXZlbnRBcmdzfVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oYXJnMikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogZ2V0RG9jdW1lbnQoKS5ib2R5LFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMSksXG4gICAgICAgIGxpc3RlbmVyOiBhcmcyXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogcmVzb2x2ZVRhcmdldChhcmcxKSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzIpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnM1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBsaXN0ZW5lciB0byB8IHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3IgfCB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICBjb25zdCBiID0gaXNGdW5jdGlvbihhcmcyKVxuICAgIHJldHVybiBiID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvZmZcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oYXJnMikgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTm9kZSBwcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3QgRFVNTVlfRUxUID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdvdXRwdXQnKSAvLyBkdW1teSBlbGVtZW50IGZvciBiYWQgc2VsZWN0b3JzXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ck5hbWVcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgYXR0ck5hbWUpIHtcbiAgICBjb25zdCBhdHRyVGFyZ2V0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0ck5hbWUpXG4gICAgaWYgKGF0dHJUYXJnZXQpIHtcbiAgICAgIGlmIChhdHRyVGFyZ2V0ID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIFtmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyTmFtZSldXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgYXR0clRhcmdldClcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsb2dFcnJvcignVGhlIHNlbGVjdG9yIFwiJyArIGF0dHJUYXJnZXQgKyAnXCIgb24gJyArIGF0dHJOYW1lICsgJyByZXR1cm5lZCBubyBtYXRjaGVzIScpXG4gICAgICAgICAgcmV0dXJuIFtEVU1NWV9FTFRdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBhc0VsZW1lbnQoZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoYXNFbGVtZW50KGVsdCksIGF0dHJpYnV0ZSkgIT0gbnVsbFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VGFyZ2V0KGVsdCkge1xuICAgIGNvbnN0IHRhcmdldFN0ciA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKVxuICAgIGlmICh0YXJnZXRTdHIpIHtcbiAgICAgIGlmICh0YXJnZXRTdHIgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRhcmdldFN0cilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAoZGF0YS5ib29zdGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUobmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXNUb1NldHRsZSA9IGh0bXguY29uZmlnLmF0dHJpYnV0ZXNUb1NldHRsZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlc1RvU2V0dGxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmFtZSA9PT0gYXR0cmlidXRlc1RvU2V0dGxlW2ldKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VUb1xuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlRnJvbVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvbmVBdHRyaWJ1dGVzKG1lcmdlVG8sIG1lcmdlRnJvbSkge1xuICAgIGZvckVhY2gobWVyZ2VUby5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoIW1lcmdlRnJvbS5oYXNBdHRyaWJ1dGUoYXR0ci5uYW1lKSAmJiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKG1lcmdlRnJvbS5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpIHtcbiAgICBjb25zdCBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyh0YXJnZXQpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzSW5saW5lU3dhcChzd2FwU3R5bGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFN0eWxlID09PSAnb3V0ZXJIVE1MJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvb2JWYWx1ZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9vYkVsZW1lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGxldCBzZWxlY3RvciA9ICcjJyArIGdldFJhd0F0dHJpYnV0ZShvb2JFbGVtZW50LCAnaWQnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFN0eWxlICovXG4gICAgbGV0IHN3YXBTdHlsZSA9ICdvdXRlckhUTUwnXG4gICAgaWYgKG9vYlZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKG9vYlZhbHVlLmluZGV4T2YoJzonKSA+IDApIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlLnN1YnN0cigwLCBvb2JWYWx1ZS5pbmRleE9mKCc6JykpXG4gICAgICBzZWxlY3RvciA9IG9vYlZhbHVlLnN1YnN0cihvb2JWYWx1ZS5pbmRleE9mKCc6JykgKyAxLCBvb2JWYWx1ZS5sZW5ndGgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICBpZiAodGFyZ2V0cykge1xuICAgICAgZm9yRWFjaChcbiAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgICAgbGV0IGZyYWdtZW50XG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudENsb25lID0gb29iRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICBmcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQob29iRWxlbWVudENsb25lKVxuICAgICAgICAgIGlmICghaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBhc1BhcmVudE5vZGUob29iRWxlbWVudENsb25lKSAvLyBpZiB0aGlzIGlzIG5vdCBhbiBpbmxpbmUgc3dhcCwgd2UgdXNlIHRoZSBjb250ZW50IG9mIHRoZSBub2RlLCBub3QgdGhlIG5vZGUgaXRzZWxmXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlU3dhcERldGFpbHMgPSB7IHNob3VsZFN3YXA6IHRydWUsIHRhcmdldCwgZnJhZ21lbnQgfVxuICAgICAgICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6b29iQmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICAgICAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgICAgICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgICAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCB0YXJnZXQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14Om9vYkFmdGVyU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6b29iRXJyb3JOb1RhcmdldCcsIHsgY29udGVudDogb29iRWxlbWVudCB9KVxuICAgIH1cbiAgICByZXR1cm4gb29iVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudCkge1xuICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ1toeC1wcmVzZXJ2ZV0sIFtkYXRhLWh4LXByZXNlcnZlXScpLCBmdW5jdGlvbihwcmVzZXJ2ZWRFbHQpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0QXR0cmlidXRlVmFsdWUocHJlc2VydmVkRWx0LCAnaWQnKVxuICAgICAgY29uc3Qgb2xkRWx0ID0gZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgIGlmIChvbGRFbHQgIT0gbnVsbCkge1xuICAgICAgICBwcmVzZXJ2ZWRFbHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQob2xkRWx0LCBwcmVzZXJ2ZWRFbHQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyksIGZ1bmN0aW9uKG5ld05vZGUpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UmF3QXR0cmlidXRlKG5ld05vZGUsICdpZCcpXG4gICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkSWQgPSBpZC5yZXBsYWNlKFwiJ1wiLCBcIlxcXFwnXCIpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYWcgPSBuZXdOb2RlLnRhZ05hbWUucmVwbGFjZSgnOicsICdcXFxcOicpXG4gICAgICAgIGNvbnN0IHBhcmVudEVsdCA9IGFzUGFyZW50Tm9kZShwYXJlbnROb2RlKVxuICAgICAgICBjb25zdCBvbGROb2RlID0gcGFyZW50RWx0ICYmIHBhcmVudEVsdC5xdWVyeVNlbGVjdG9yKG5vcm1hbGl6ZWRUYWcgKyBcIltpZD0nXCIgKyBub3JtYWxpemVkSWQgKyBcIiddXCIpXG4gICAgICAgIGlmIChvbGROb2RlICYmIG9sZE5vZGUgIT09IHBhcmVudEVsdCkge1xuICAgICAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBuZXdOb2RlLmNsb25lTm9kZSgpXG4gICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG9sZE5vZGUpXG4gICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG5ld0F0dHJpYnV0ZXMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBjaGlsZFxuICAgKiBAcmV0dXJucyB7SHRteFNldHRsZVRhc2t9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlQWpheExvYWRUYXNrKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHByb2Nlc3NOb2RlKGFzRWxlbWVudChjaGlsZCkpXG4gICAgICBwcm9jZXNzRm9jdXMoYXNQYXJlbnROb2RlKGNoaWxkKSlcbiAgICAgIHRyaWdnZXJFdmVudChjaGlsZCwgJ2h0bXg6bG9hZCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gY2hpbGRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NGb2N1cyhjaGlsZCkge1xuICAgIGNvbnN0IGF1dG9mb2N1cyA9ICdbYXV0b2ZvY3VzXSdcbiAgICBjb25zdCBhdXRvRm9jdXNlZEVsdCA9IGFzSHRtbEVsZW1lbnQobWF0Y2hlcyhjaGlsZCwgYXV0b2ZvY3VzKSA/IGNoaWxkIDogY2hpbGQucXVlcnlTZWxlY3RvcihhdXRvZm9jdXMpKVxuICAgIGlmIChhdXRvRm9jdXNlZEVsdCAhPSBudWxsKSB7XG4gICAgICBhdXRvRm9jdXNlZEVsdC5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge05vZGV9IGluc2VydEJlZm9yZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydEJlZm9yZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIHdoaWxlIChmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZFxuICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGNoaWxkKSwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbnNlcnRCZWZvcmUpXG4gICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJhc2VkIG9uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2h5YW1hbW90by9mZDQzNTUwNWQyOWViZmEzZDk3MTZmZDJiZThkNDJmMCxcbiAgICogZGVyaXZlZCBmcm9tIEphdmEncyBzdHJpbmcgaGFzaGNvZGUgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaGFzaFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nSGFzaChzdHJpbmcsIGhhc2gpIHtcbiAgICBsZXQgY2hhciA9IDBcbiAgICB3aGlsZSAoY2hhciA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBzdHJpbmcuY2hhckNvZGVBdChjaGFyKyspIHwgMCAvLyBiaXR3aXNlIG9yIGVuc3VyZXMgd2UgaGF2ZSBhIDMyLWJpdCBpbnRcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYXR0cmlidXRlSGFzaChlbHQpIHtcbiAgICBsZXQgaGFzaCA9IDBcbiAgICAvLyBJRSBmaXhcbiAgICBpZiAoZWx0LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWx0LmF0dHJpYnV0ZXNbaV1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZS52YWx1ZSkgeyAvLyBvbmx5IGluY2x1ZGUgYXR0cmlidXRlcyB3LyBhY3R1YWwgdmFsdWVzIChlbXB0eSBpcyBzYW1lIGFzIG5vbi1leGlzdGVudClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUubmFtZSwgaGFzaClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUudmFsdWUsIGhhc2gpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE9uSGFuZGxlcnMoZWx0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZm8gPSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1tpXVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChlbHQsIGhhbmRsZXJJbmZvLmV2ZW50LCBoYW5kbGVySW5mby5saXN0ZW5lcilcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE5vZGUoZWxlbWVudCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbGVtZW50KVxuICAgIGlmIChpbnRlcm5hbERhdGEudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVybmFsRGF0YS50aW1lb3V0KVxuICAgIH1cbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MpIHtcbiAgICAgIGZvckVhY2goaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MsIGZ1bmN0aW9uKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8ub24pIHtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChpbmZvLm9uLCBpbmZvLnRyaWdnZXIsIGluZm8ubGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWxlbWVudClcbiAgICBmb3JFYWNoKE9iamVjdC5rZXlzKGludGVybmFsRGF0YSksIGZ1bmN0aW9uKGtleSkgeyBkZWxldGUgaW50ZXJuYWxEYXRhW2tleV0gfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuVXBFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKVxuICAgIGRlSW5pdE5vZGUoZWxlbWVudClcbiAgICAvLyBAdHMtaWdub3JlIElFMTEgY29kZVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikgeyAvLyBJRVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yRWFjaChlbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkgeyBjbGVhblVwRWxlbWVudChjaGlsZCkgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiB0YXJnZXQudGFnTmFtZSA9PT0gJ0JPRFknKSB7IC8vIHNwZWNpYWwgY2FzZSB0aGUgYm9keSB0byBpbm5lckhUTUwgYmVjYXVzZSBEb2N1bWVudEZyYWdtZW50cyBjYW4ndCBjb250YWluIGEgYm9keSBlbHQgdW5mb3J0dW5hdGVseVxuICAgICAgcmV0dXJuIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtOb2RlfSAqL1xuICAgIGxldCBuZXdFbHRcbiAgICBjb25zdCBlbHRCZWZvcmVOZXdDb250ZW50ID0gdGFyZ2V0LnByZXZpb3VzU2libGluZ1xuICAgIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChlbHRCZWZvcmVOZXdDb250ZW50ID09IG51bGwpIHtcbiAgICAgIG5ld0VsdCA9IHBhcmVudEVsdCh0YXJnZXQpLmZpcnN0Q2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWx0ID0gZWx0QmVmb3JlTmV3Q29udGVudC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBzZXR0bGVJbmZvLmVsdHMgPSBzZXR0bGVJbmZvLmVsdHMuZmlsdGVyKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUgIT09IHRhcmdldCB9KVxuICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgbmV3bHkgYWRkZWQgY29udGVudCBhbmQgYWRkIGFsbCBlbGVtZW50cyB0byB0aGUgc2V0dGxlIGluZm8gc28gd2UgdHJpZ2dlclxuICAgIC8vIGV2ZW50cyBwcm9wZXJseSBvbiB0aGVtXG4gICAgd2hpbGUgKG5ld0VsdCAmJiBuZXdFbHQgIT09IHRhcmdldCkge1xuICAgICAgaWYgKG5ld0VsdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgc2V0dGxlSW5mby5lbHRzLnB1c2gobmV3RWx0KVxuICAgICAgfVxuICAgICAgbmV3RWx0ID0gbmV3RWx0Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGFyZ2V0LnJlbW92ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgdGFyZ2V0LmZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBudWxsLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQubmV4dFNpYmxpbmcsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqL1xuICBmdW5jdGlvbiBzd2FwRGVsZXRlKHRhcmdldCkge1xuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICByZXR1cm4gcGFyZW50RWx0KHRhcmdldCkucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgY29uc3QgZmlyc3RDaGlsZCA9IHRhcmdldC5maXJzdENoaWxkXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBmaXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgd2hpbGUgKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICB9XG4gICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkKVxuICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHN3aXRjaCAoc3dhcFN0eWxlKSB7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdvdXRlckhUTUwnOlxuICAgICAgICBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJiZWdpbic6XG4gICAgICAgIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlYmVnaW4nOlxuICAgICAgICBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmVlbmQnOlxuICAgICAgICBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJlbmQnOlxuICAgICAgICBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBzd2FwRGVsZXRlKHRhcmdldClcbiAgICAgICAgcmV0dXJuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMoZWx0KVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBleHRlbnNpb25zW2ldXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZXh0LmhhbmRsZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0VsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGhhbmRsZVN3YXAgcmV0dXJucyBhbiBhcnJheSAobGlrZSkgb2YgZWxlbWVudHMsIHdlIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdFbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBuZXdFbGVtZW50c1tqXVxuICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3dhcFN0eWxlID09PSAnaW5uZXJIVE1MJykge1xuICAgICAgICAgIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2FwV2l0aFN0eWxlKGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICB2YXIgb29iRWx0cyA9IGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtc3dhcC1vb2JdLCBbZGF0YS1oeC1zd2FwLW9vYl0nKVxuICAgIGZvckVhY2gob29iRWx0cywgZnVuY3Rpb24ob29iRWxlbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93TmVzdGVkT29iU3dhcHMgfHwgb29iRWxlbWVudC5wYXJlbnRFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG9vYlZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUob29iRWxlbWVudCwgJ2h4LXN3YXAtb29iJylcbiAgICAgICAgaWYgKG9vYlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaHgtc3dhcC1vb2InKVxuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oeC1zd2FwLW9vYicpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gb29iRWx0cy5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBjb21wbGV0ZSBzd2FwcGluZyBwaXBlbGluZSwgaW5jbHVkaW5nOiBmb2N1cyBhbmQgc2VsZWN0aW9uIHByZXNlcnZhdGlvbixcbiAgICogdGl0bGUgdXBkYXRlcywgc2Nyb2xsLCBPT0Igc3dhcHBpbmcsIG5vcm1hbCBzd2FwcGluZyBhbmQgc2V0dGxpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKiBAcGFyYW0ge1N3YXBPcHRpb25zfSBbc3dhcE9wdGlvbnNdXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwKHRhcmdldCwgY29udGVudCwgc3dhcFNwZWMsIHN3YXBPcHRpb25zKSB7XG4gICAgaWYgKCFzd2FwT3B0aW9ucykge1xuICAgICAgc3dhcE9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIHRhcmdldCA9IHJlc29sdmVUYXJnZXQodGFyZ2V0KVxuXG4gICAgLy8gcHJlc2VydmUgZm9jdXMgYW5kIHNlbGVjdGlvblxuICAgIGNvbnN0IGFjdGl2ZUVsdCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICBsZXQgc2VsZWN0aW9uSW5mbyA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIHNlbGVjdGlvbkluZm8gPSB7XG4gICAgICAgIGVsdDogYWN0aXZlRWx0LFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXJ0OiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uU3RhcnQgOiBudWxsLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVuZDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvbkVuZCA6IG51bGxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzYWZhcmkgaXNzdWUgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9wbGF5d3JpZ2h0L2lzc3Vlcy81ODk0XG4gICAgfVxuICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpXG5cbiAgICAvLyBGb3IgdGV4dCBjb250ZW50IHN3YXBzLCBkb24ndCBwYXJzZSB0aGUgcmVzcG9uc2UgYXMgSFRNTCwganVzdCBpbnNlcnQgaXRcbiAgICBpZiAoc3dhcFNwZWMuc3dhcFN0eWxlID09PSAndGV4dENvbnRlbnQnKSB7XG4gICAgICB0YXJnZXQudGV4dENvbnRlbnQgPSBjb250ZW50XG4gICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBmcmFnbWVudCBhbmQgcHJvY2VzcyBpdFxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY29udGVudClcblxuICAgICAgc2V0dGxlSW5mby50aXRsZSA9IGZyYWdtZW50LnRpdGxlXG5cbiAgICAgIC8vIHNlbGVjdC1vb2Igc3dhcHNcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3RPT0IpIHtcbiAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWVzID0gc3dhcE9wdGlvbnMuc2VsZWN0T09CLnNwbGl0KCcsJylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvb2JTZWxlY3RWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlc1tpXS5zcGxpdCgnOicsIDIpXG4gICAgICAgICAgbGV0IGlkID0gb29iU2VsZWN0VmFsdWVbMF0udHJpbSgpXG4gICAgICAgICAgaWYgKGlkLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcoMSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBvb2JTZWxlY3RWYWx1ZVsxXSB8fCAndHJ1ZSdcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignIycgKyBpZClcbiAgICAgICAgICBpZiAob29iRWxlbWVudCkge1xuICAgICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9vYiBzd2Fwc1xuICAgICAgZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ3RlbXBsYXRlJyksIC8qKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlICovZnVuY3Rpb24odGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGZpbmRBbmRTd2FwT29iRWxlbWVudHModGVtcGxhdGUuY29udGVudCwgc2V0dGxlSW5mbykpIHtcbiAgICAgICAgICAvLyBBdm9pZCBwb2xsdXRpbmcgdGhlIERPTSB3aXRoIGVtcHR5IHRlbXBsYXRlcyB0aGF0IHdlcmUgb25seSB1c2VkIHRvIGVuY2Fwc3VsYXRlIG9vYiBzd2FwXG4gICAgICAgICAgdGVtcGxhdGUucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gbm9ybWFsIHN3YXBcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3QpIHtcbiAgICAgICAgY29uc3QgbmV3RnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3dhcE9wdGlvbnMuc2VsZWN0KSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIG5ld0ZyYWdtZW50LmFwcGVuZENoaWxkKG5vZGUpXG4gICAgICAgIH0pXG4gICAgICAgIGZyYWdtZW50ID0gbmV3RnJhZ21lbnRcbiAgICAgIH1cbiAgICAgIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KVxuICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3BlYy5zd2FwU3R5bGUsIHN3YXBPcHRpb25zLmNvbnRleHRFbGVtZW50LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cblxuICAgIC8vIGFwcGx5IHNhdmVkIGZvY3VzIGFuZCBzZWxlY3Rpb24gaW5mb3JtYXRpb24gdG8gc3dhcHBlZCBjb250ZW50XG4gICAgaWYgKHNlbGVjdGlvbkluZm8uZWx0ICYmXG4gICAgICAhYm9keUNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZWx0KSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSkge1xuICAgICAgY29uc3QgbmV3QWN0aXZlRWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSlcbiAgICAgIGNvbnN0IGZvY3VzT3B0aW9ucyA9IHsgcHJldmVudFNjcm9sbDogc3dhcFNwZWMuZm9jdXNTY3JvbGwgIT09IHVuZGVmaW5lZCA/ICFzd2FwU3BlYy5mb2N1c1Njcm9sbCA6ICFodG14LmNvbmZpZy5kZWZhdWx0Rm9jdXNTY3JvbGwgfVxuICAgICAgaWYgKG5ld0FjdGl2ZUVsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChzZWxlY3Rpb25JbmZvLnN0YXJ0ICYmIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uSW5mby5zdGFydCwgc2VsZWN0aW9uSW5mby5lbmQpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdGhlIHNldFNlbGVjdGlvblJhbmdlIG1ldGhvZCBpcyBwcmVzZW50IG9uIGZpZWxkcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQsIHNvIGp1c3QgbGV0IHRoaXMgZmFpbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdBY3RpdmVFbHQuZm9jdXMoZm9jdXNPcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG4gICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU3dhcCcsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICB9KVxuICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaykge1xuICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2soKVxuICAgIH1cblxuICAgIC8vIG1lcmdlIGluIG5ldyB0aXRsZSBhZnRlciBzd2FwIGJ1dCBiZWZvcmUgc2V0dGxlXG4gICAgaWYgKCFzd2FwU3BlYy5pZ25vcmVUaXRsZSkge1xuICAgICAgaGFuZGxlVGl0bGUoc2V0dGxlSW5mby50aXRsZSlcbiAgICB9XG5cbiAgICAvLyBzZXR0bGVcbiAgICBjb25zdCBkb1NldHRsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLnRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgIHRhc2suY2FsbCgpXG4gICAgICB9KVxuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTZXR0bGUnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgICB9KVxuXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYW5jaG9yKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclRhcmdldCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KCcjJyArIHN3YXBPcHRpb25zLmFuY2hvcikpXG4gICAgICAgIGlmIChhbmNob3JUYXJnZXQpIHtcbiAgICAgICAgICBhbmNob3JUYXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6ICdhdXRvJyB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVNjcm9sbFN0YXRlKHNldHRsZUluZm8uZWx0cywgc3dhcFNwZWMpXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaykge1xuICAgICAgICBzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3dhcFNwZWMuc2V0dGxlRGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU2V0dGxlLCBzd2FwU3BlYy5zZXR0bGVEZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TZXR0bGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCBoZWFkZXIsIGVsdCkge1xuICAgIGNvbnN0IHRyaWdnZXJCb2R5ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlcilcbiAgICBpZiAodHJpZ2dlckJvZHkuaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICBjb25zdCB0cmlnZ2VycyA9IHBhcnNlSlNPTih0cmlnZ2VyQm9keSlcbiAgICAgIGZvciAoY29uc3QgZXZlbnROYW1lIGluIHRyaWdnZXJzKSB7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgICAgbGV0IGRldGFpbCA9IHRyaWdnZXJzW2V2ZW50TmFtZV1cbiAgICAgICAgICBpZiAoaXNSYXdPYmplY3QoZGV0YWlsKSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWx0ID0gZGV0YWlsLnRhcmdldCAhPT0gdW5kZWZpbmVkID8gZGV0YWlsLnRhcmdldCA6IGVsdFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRhaWwgPSB7IHZhbHVlOiBkZXRhaWwgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBldmVudE5hbWVzID0gdHJpZ2dlckJvZHkuc3BsaXQoJywnKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZXNbaV0udHJpbSgpLCBbXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBXSElURVNQQUNFID0gL1xccy9cbiAgY29uc3QgV0hJVEVTUEFDRV9PUl9DT01NQSA9IC9bXFxzLF0vXG4gIGNvbnN0IFNZTUJPTF9TVEFSVCA9IC9bXyRhLXpBLVpdL1xuICBjb25zdCBTWU1CT0xfQ09OVCA9IC9bXyRhLXpBLVowLTldL1xuICBjb25zdCBTVFJJTkdJU0hfU1RBUlQgPSBbJ1wiJywgXCInXCIsICcvJ11cbiAgY29uc3QgTk9UX1dISVRFU1BBQ0UgPSAvW15cXHNdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVCA9IC9beyhdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQgPSAvW30pXS9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZVN0cmluZyhzdHIpIHtcbiAgICAvKiogQHR5cGUgc3RyaW5nW10gKi9cbiAgICBjb25zdCB0b2tlbnMgPSBbXVxuICAgIGxldCBwb3NpdGlvbiA9IDBcbiAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoKSB7XG4gICAgICBpZiAoU1lNQk9MX1NUQVJULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbikpKSB7XG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgd2hpbGUgKFNZTUJPTF9DT05ULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbiArIDEpKSkge1xuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIGlmIChTVFJJTkdJU0hfU1RBUlQuaW5kZXhPZihzdHIuY2hhckF0KHBvc2l0aW9uKSkgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2hhciA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoICYmIHN0ci5jaGFyQXQocG9zaXRpb24pICE9PSBzdGFydENoYXIpIHtcbiAgICAgICAgICBpZiAoc3RyLmNoYXJBdChwb3NpdGlvbikgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHRva2Vucy5wdXNoKHN5bWJvbClcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9uKytcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBsYXN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkge1xuICAgIHJldHVybiBTWU1CT0xfU1RBUlQuZXhlYyh0b2tlbi5jaGFyQXQoMCkpICYmXG4gICAgICB0b2tlbiAhPT0gJ3RydWUnICYmXG4gICAgICB0b2tlbiAhPT0gJ2ZhbHNlJyAmJlxuICAgICAgdG9rZW4gIT09ICd0aGlzJyAmJlxuICAgICAgdG9rZW4gIT09IHBhcmFtTmFtZSAmJlxuICAgICAgbGFzdCAhPT0gJy4nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Q29uZGl0aW9uYWxGdW5jdGlvbnxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCBwYXJhbU5hbWUpIHtcbiAgICBpZiAodG9rZW5zWzBdID09PSAnWycpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICBsZXQgYnJhY2tldENvdW50ID0gMVxuICAgICAgbGV0IGNvbmRpdGlvbmFsU291cmNlID0gJyByZXR1cm4gKGZ1bmN0aW9uKCcgKyBwYXJhbU5hbWUgKyAnKXsgcmV0dXJuICgnXG4gICAgICBsZXQgbGFzdCA9IG51bGxcbiAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1swXVxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBzaGlmdCBjYWxsLCBhbmQgdGhpbmtzIHdlJ3JlIGNvbXBhcmluZyB0aGUgc2FtZSB2YWx1ZSBoZXJlLCBpLmUuICdbJyB2cyAnXSdcbiAgICAgICAgaWYgKHRva2VuID09PSAnXScpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQtLVxuICAgICAgICAgIGlmIChicmFja2V0Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChsYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyAndHJ1ZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKX0pJ1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uRnVuY3Rpb24gPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oY29uZGl0aW9uYWxTb3VyY2UpKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pXG4gICAgICAgICAgICAgIGNvbmRpdGlvbkZ1bmN0aW9uLnNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlXG4gICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25GdW5jdGlvblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnN5bnRheDplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZTogY29uZGl0aW9uYWxTb3VyY2UgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdbJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudCsrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSkge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcoKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpID8gKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpIDogKHdpbmRvdy4nICsgdG9rZW4gKyAnKSknXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArIHRva2VuXG4gICAgICAgIH1cbiAgICAgICAgbGFzdCA9IHRva2Vucy5zaGlmdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gbWF0Y2hcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbCh0b2tlbnMsIG1hdGNoKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmICFtYXRjaC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHJlc3VsdCArPSB0b2tlbnMuc2hpZnQoKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKSB7XG4gICAgbGV0IHJlc3VsdFxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMCAmJiBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQpLnRyaW0oKVxuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY29uc3QgSU5QVVRfU0VMRUNUT1IgPSAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBsaWNpdFRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIGZvciB0cmlnZ2VyIHNwZWNzXG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSkge1xuICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXSAqL1xuICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVTdHJpbmcoZXhwbGljaXRUcmlnZ2VyKVxuICAgIGRvIHtcbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IHRva2Vucy5sZW5ndGhcbiAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLylcbiAgICAgIGlmICh0cmlnZ2VyICE9PSAnJykge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2V2ZXJ5Jykge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCBldmVyeSA9IHsgdHJpZ2dlcjogJ2V2ZXJ5JyB9XG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgZXZlcnkucG9sbEludGVydmFsID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLykpXG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgZXZlcnkuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaChldmVyeSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgdHJpZ2dlclNwZWMgPSB7IHRyaWdnZXIgfVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXSAhPT0gJywnKSB7XG4gICAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gJ2NoYW5nZWQnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnb25jZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMub25jZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdjb25zdW1lJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jb25zdW1lID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2RlbGF5JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5kZWxheSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZnJvbScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgaWYgKENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgICAgICBpZiAoZnJvbV9hcmcgPT09ICdjbG9zZXN0JyB8fCBmcm9tX2FyZyA9PT0gJ2ZpbmQnIHx8IGZyb21fYXJnID09PSAnbmV4dCcgfHwgZnJvbV9hcmcgPT09ICdwcmV2aW91cycpIHtcbiAgICAgICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgICAgICAvLyBgbmV4dGAgYW5kIGBwcmV2aW91c2AgYWxsb3cgYSBzZWxlY3Rvci1sZXNzIHN5bnRheFxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbV9hcmcgKz0gJyAnICsgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZnJvbSA9IGZyb21fYXJnXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGFyZ2V0JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50YXJnZXQgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Rocm90dGxlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50aHJvdHRsZSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncXVldWUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnF1ZXVlID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdyb290JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RocmVzaG9sZCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2godHJpZ2dlclNwZWMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSBpbml0aWFsTGVuZ3RoKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgIH0gd2hpbGUgKHRva2Vuc1swXSA9PT0gJywnICYmIHRva2Vucy5zaGlmdCgpKVxuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSA9IHRyaWdnZXJTcGVjc1xuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VHJpZ2dlclNwZWNzKGVsdCkge1xuICAgIGNvbnN0IGV4cGxpY2l0VHJpZ2dlciA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRyaWdnZXInKVxuICAgIGxldCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGlmIChleHBsaWNpdFRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gaHRteC5jb25maWcudHJpZ2dlclNwZWNzQ2FjaGVcbiAgICAgIHRyaWdnZXJTcGVjcyA9IChjYWNoZSAmJiBjYWNoZVtleHBsaWNpdFRyaWdnZXJdKSB8fCBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpXG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJTcGVjcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdzdWJtaXQnIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJidXR0b25cIl0sIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCBJTlBVVF9TRUxFQ1RPUikpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2hhbmdlJyB9XVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gY2FuY2VsUG9sbGluZyhlbHQpIHtcbiAgICBnZXRJbnRlcm5hbERhdGEoZWx0KS5jYW5jZWxsZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gc3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIG5vZGVEYXRhLnRpbWVvdXQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGJvZHlDb250YWlucyhlbHQpICYmIG5vZGVEYXRhLmNhbmNlbGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQoc3BlYywgZWx0LCBtYWtlRXZlbnQoJ2h4OnBvbGw6dHJpZ2dlcicsIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlYzogc3BlYyxcbiAgICAgICAgICB0YXJnZXQ6IGVsdFxuICAgICAgICB9KSkpIHtcbiAgICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpXG4gICAgICB9XG4gICAgfSwgc3BlYy5wb2xsSW50ZXJ2YWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MQW5jaG9yRWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNMb2NhbExpbmsoZWx0KSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uLmhvc3RuYW1lID09PSBlbHQuaG9zdG5hbWUgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpICE9PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGVsdElzRGlzYWJsZWQoZWx0KSB7XG4gICAgcmV0dXJuIGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqL1xuICBmdW5jdGlvbiBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgaWYgKChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBpc0xvY2FsTGluayhlbHQpICYmIChlbHQudGFyZ2V0ID09PSAnJyB8fCBlbHQudGFyZ2V0ID09PSAnX3NlbGYnKSkgfHwgKGVsdC50YWdOYW1lID09PSAnRk9STScgJiYgU3RyaW5nKGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKSkudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpKSB7XG4gICAgICBub2RlRGF0YS5ib29zdGVkID0gdHJ1ZVxuICAgICAgbGV0IHZlcmIsIHBhdGhcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgIHZlcmIgPSAnZ2V0J1xuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3QXR0cmlidXRlID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpXG4gICAgICAgIHZlcmIgPSByYXdBdHRyaWJ1dGUgPyByYXdBdHRyaWJ1dGUudG9Mb3dlckNhc2UoKSA6ICdnZXQnXG4gICAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgICB9XG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnYWN0aW9uJylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgfSwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZENhbmNlbChldnQsIG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChldnQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZXZ0LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwic3VibWl0XCJdLCBidXR0b24nKSAmJiBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGVsdC5ocmVmICYmXG4gICAgICAgIChlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT09ICcjJyB8fCBlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykuaW5kZXhPZignIycpICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fE1vdXNlRXZlbnR8S2V5Ym9hcmRFdmVudHxUb3VjaEV2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZXZ0LnR5cGUgPT09ICdjbGljaycgJiZcbiAgICAgIC8vIEB0cy1pZ25vcmUgdGhpcyB3aWxsIHJlc29sdmUgdG8gdW5kZWZpbmVkIGZvciBldmVudHMgdGhhdCBkb24ndCBkZWZpbmUgdGhvc2UgcHJvcGVydGllcywgd2hpY2ggaXMgZmluZVxuICAgICAgKGV2dC5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkge1xuICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXJcbiAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEZpbHRlci5jYWxsKGVsdCwgZXZ0KSAhPT0gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmVudEZpbHRlci5zb3VyY2VcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpldmVudEZpbHRlcjplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtleHBsaWNpdENhbmNlbF1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIGV4cGxpY2l0Q2FuY2VsKSB7XG4gICAgY29uc3QgZWxlbWVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIC8qKiBAdHlwZSB7KE5vZGV8V2luZG93KVtdfSAqL1xuICAgIGxldCBlbHRzVG9MaXN0ZW5PblxuICAgIGlmICh0cmlnZ2VyU3BlYy5mcm9tKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCB0cmlnZ2VyU3BlYy5mcm9tKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IFtlbHRdXG4gICAgfVxuICAgIC8vIHN0b3JlIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMsIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXkgY2hhbmdlXG4gICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uLmZvckVhY2goZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgfSlcbiAgICB9XG4gICAgZm9yRWFjaChlbHRzVG9MaXN0ZW5PbiwgZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGVsdFRvTGlzdGVuT24ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBsaWNpdENhbmNlbCB8fCBzaG91bGRDYW5jZWwoZXZ0LCBlbHQpKSB7XG4gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2dClcbiAgICAgICAgZXZlbnREYXRhLnRyaWdnZXJTcGVjID0gdHJpZ2dlclNwZWNcbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yID09IG51bGwpIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvciA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yLmluZGV4T2YoZWx0KSA8IDApIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvci5wdXNoKGVsdClcbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY29uc3VtZSkge1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50YXJnZXQgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKGFzRWxlbWVudChldnQudGFyZ2V0KSwgdHJpZ2dlclNwZWMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLm9uY2UpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgICAgICAgaWYgKGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEuZGVsYXllZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVsZW1lbnREYXRhLmRlbGF5ZWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocm90dGxlID4gMCkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gbnVsbFxuICAgICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy50aHJvdHRsZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLmRlbGF5ID4gMCkge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZGVsYXllZCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub2RlRGF0YS5saXN0ZW5lckluZm9zID09IG51bGwpIHtcbiAgICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcyA9IFtdXG4gICAgICB9XG4gICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyU3BlYy50cmlnZ2VyLFxuICAgICAgICBsaXN0ZW5lcjogZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgb246IGVsdFRvTGlzdGVuT25cbiAgICAgIH0pXG4gICAgICBlbHRUb0xpc3Rlbk9uLmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICB9KVxuICB9XG5cbiAgbGV0IHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2UgLy8gdXNlZCBieSBpbml0U2Nyb2xsSGFuZGxlclxuICBsZXQgc2Nyb2xsSGFuZGxlciA9IG51bGxcbiAgZnVuY3Rpb24gaW5pdFNjcm9sbEhhbmRsZXIoKSB7XG4gICAgaWYgKCFzY3JvbGxIYW5kbGVyKSB7XG4gICAgICBzY3JvbGxIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgICAgfVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpXG4gICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHdpbmRvd0lzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgICAgICAgIGZvckVhY2goZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXIqPSdyZXZlYWxlZCddLFtkYXRhLWh4LXRyaWdnZXIqPSdyZXZlYWxlZCddXCIpLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIG1heWJlUmV2ZWFsKGVsdClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVJldmVhbChlbHQpIHtcbiAgICBpZiAoIWhhc0F0dHJpYnV0ZShlbHQsICdkYXRhLWh4LXJldmVhbGVkJykgJiYgaXNTY3JvbGxlZEludG9WaWV3KGVsdCkpIHtcbiAgICAgIGVsdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaHgtcmV2ZWFsZWQnLCAndHJ1ZScpXG4gICAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAobm9kZURhdGEuaW5pdEhhc2gpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZSBub2RlIGlzbid0IGluaXRpYWxpemVkLCB3YWl0IGZvciBpdCBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgcmVxdWVzdFxuICAgICAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphZnRlclByb2Nlc3NOb2RlJywgZnVuY3Rpb24oKSB7IHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpIH0sIHsgb25jZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5XG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSW1tZWRpYXRlbHkoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgZGVsYXkpIHtcbiAgICBjb25zdCBsb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW5vZGVEYXRhLmxvYWRlZCkge1xuICAgICAgICBub2RlRGF0YS5sb2FkZWQgPSB0cnVlXG4gICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGxvYWQsIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGxldCBleHBsaWNpdEFjdGlvbiA9IGZhbHNlXG4gICAgZm9yRWFjaChWRVJCUywgZnVuY3Rpb24odmVyYikge1xuICAgICAgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC0nICsgdmVyYikpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LScgKyB2ZXJiKVxuICAgICAgICBleHBsaWNpdEFjdGlvbiA9IHRydWVcbiAgICAgICAgbm9kZURhdGEucGF0aCA9IHBhdGhcbiAgICAgICAgbm9kZURhdGEudmVyYiA9IHZlcmJcbiAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGV4cGxpY2l0QWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQGNhbGxiYWNrIFRyaWdnZXJIYW5kbGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IFtldnRdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKi9cbiAgZnVuY3Rpb24gYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGhhbmRsZXIpIHtcbiAgICBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ3JldmVhbGVkJykge1xuICAgICAgaW5pdFNjcm9sbEhhbmRsZXIoKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICAgIG1heWJlUmV2ZWFsKGFzRWxlbWVudChlbHQpKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2ludGVyc2VjdCcpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyT3B0aW9ucyA9IHt9XG4gICAgICBpZiAodHJpZ2dlclNwZWMucm9vdCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMucm9vdCA9IHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0cmlnZ2VyU3BlYy5yb290KVxuICAgICAgfVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocmVzaG9sZCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMudGhyZXNob2xkID0gcGFyc2VGbG9hdCh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpXG4gICAgICB9XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlbnRyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXVxuICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2ludGVyc2VjdCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgb2JzZXJ2ZXJPcHRpb25zKVxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShhc0VsZW1lbnQoZWx0KSlcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdsb2FkJykge1xuICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIG1ha2VFdmVudCgnbG9hZCcsIHsgZWx0IH0pKSkge1xuICAgICAgICBsb2FkSW1tZWRpYXRlbHkoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnBvbGxJbnRlcnZhbCA+IDApIHtcbiAgICAgIG5vZGVEYXRhLnBvbGxpbmcgPSB0cnVlXG4gICAgICBwcm9jZXNzUG9sbGluZyhhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3NIeE9uKG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbHQuYXR0cmlidXRlc1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdLm5hbWVcbiAgICAgIGlmIChzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb246JykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb246JykgfHxcbiAgICAgICAgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uLScpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uLScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBjb25zdCBIWF9PTl9RVUVSWSA9IG5ldyBYUGF0aEV2YWx1YXRvcigpXG4gICAgLmNyZWF0ZUV4cHJlc3Npb24oJy4vLypbQCpbIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbjpcIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb246XCIpIG9yJyArXG4gICAgICAnIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbi1cIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb24tXCIpIF1dJylcblxuICBmdW5jdGlvbiBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cykge1xuICAgIGlmIChzaG91bGRQcm9jZXNzSHhPbihlbHQpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChlbHQpKVxuICAgIH1cbiAgICBjb25zdCBpdGVyID0gSFhfT05fUVVFUlkuZXZhbHVhdGUoZWx0KVxuICAgIGxldCBub2RlID0gbnVsbFxuICAgIHdoaWxlIChub2RlID0gaXRlci5pdGVyYXRlTmV4dCgpKSBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChub2RlKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpIHtcbiAgICAvKiogQHR5cGUge0VsZW1lbnRbXX0gKi9cbiAgICBjb25zdCBlbGVtZW50cyA9IFtdXG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWx0LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgcHJvY2Vzc0hYT25Sb290KGNoaWxkLCBlbGVtZW50cylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpXG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCkge1xuICAgIGlmIChlbHQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgY29uc3QgYm9vc3RlZFNlbGVjdG9yID0gJywgW2h4LWJvb3N0XSBhLCBbZGF0YS1oeC1ib29zdF0gYSwgYVtoeC1ib29zdF0sIGFbZGF0YS1oeC1ib29zdF0nXG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvblNlbGVjdG9ycyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGUgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2VdXG4gICAgICAgIGlmIChleHRlbnNpb24uZ2V0U2VsZWN0b3JzKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMoKVxuICAgICAgICAgIGlmIChzZWxlY3RvcnMpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvblNlbGVjdG9ycy5wdXNoKHNlbGVjdG9ycylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGVsdC5xdWVyeVNlbGVjdG9yQWxsKFZFUkJfU0VMRUNUT1IgKyBib29zdGVkU2VsZWN0b3IgKyBcIiwgZm9ybSwgW3R5cGU9J3N1Ym1pdCddLFwiICtcbiAgICAgICAgJyBbaHgtZXh0XSwgW2RhdGEtaHgtZXh0XSwgW2h4LXRyaWdnZXJdLCBbZGF0YS1oeC10cmlnZ2VyXScgKyBleHRlbnNpb25TZWxlY3RvcnMuZmxhdCgpLm1hcChzID0+ICcsICcgKyBzKS5qb2luKCcnKSlcblxuICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICogc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gKi8gKGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIikpXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBlbHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIilcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGZvcm0gPSByZXNvbHZlVGFyZ2V0KCcjJyArIGdldFJhd0F0dHJpYnV0ZShlbHQsICdmb3JtJyksIGVsdC5nZXRSb290Tm9kZSgpKSB8fCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKVxuICAgIGlmICghZm9ybSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXRCdXR0b25UcmFja2luZyhlbHQpIHtcbiAgICAvLyBuZWVkIHRvIGhhbmRsZSBib3RoIGNsaWNrIGFuZCBmb2N1cyBpbjpcbiAgICAvLyAgIGZvY3VzaW4gLSBpbiBjYXNlIHNvbWVvbmUgdGFicyBpbiB0byBhIGJ1dHRvbiBhbmQgaGl0cyB0aGUgc3BhY2UgYmFyXG4gICAgLy8gICBjbGljayAtIG9uIE9TWCBidXR0b25zIGRvIG5vdCBmb2N1cyBvbiBjbGljayBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzI0XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGVcbiAgICovXG4gIGZ1bmN0aW9uIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIGNvZGUpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGVEYXRhLm9uSGFuZGxlcnMpKSB7XG4gICAgICBub2RlRGF0YS5vbkhhbmRsZXJzID0gW11cbiAgICB9XG4gICAgbGV0IGZ1bmNcbiAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICBmdW5jID0gbmV3IEZ1bmN0aW9uKCdldmVudCcsIGNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgZnVuYy5jYWxsKGVsdCwgZSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgbm9kZURhdGEub25IYW5kbGVycy5wdXNoKHsgZXZlbnQ6IGV2ZW50TmFtZSwgbGlzdGVuZXIgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0h4T25XaWxkY2FyZChlbHQpIHtcbiAgICAvLyB3aXBlIGFueSBwcmV2aW91cyBvbiBoYW5kbGVycyBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMgcHJlY2VkZW5jZVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWx0KVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGNvbnN0IHZhbHVlID0gZWx0LmF0dHJpYnV0ZXNbaV0udmFsdWVcbiAgICAgIGlmIChzdGFydHNXaXRoKG5hbWUsICdoeC1vbicpIHx8IHN0YXJ0c1dpdGgobmFtZSwgJ2RhdGEtaHgtb24nKSkge1xuICAgICAgICBjb25zdCBhZnRlck9uUG9zaXRpb24gPSBuYW1lLmluZGV4T2YoJy1vbicpICsgM1xuICAgICAgICBjb25zdCBuZXh0Q2hhciA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uLCBhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICBpZiAobmV4dENoYXIgPT09ICctJyB8fCBuZXh0Q2hhciA9PT0gJzonKSB7XG4gICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgICAvLyBpZiB0aGUgZXZlbnROYW1lIHN0YXJ0cyB3aXRoIGEgY29sb24gb3IgZGFzaCwgcHJlcGVuZCBcImh0bXhcIiBmb3Igc2hvcnRoYW5kIHN1cHBvcnRcbiAgICAgICAgICBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICc6JykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14JyArIGV2ZW50TmFtZVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICctJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoMSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnaHRteC0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSg1KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXROb2RlKGVsdCkge1xuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAobm9kZURhdGEuaW5pdEhhc2ggIT09IGF0dHJpYnV0ZUhhc2goZWx0KSkge1xuICAgICAgLy8gY2xlYW4gdXAgYW55IHByZXZpb3VzbHkgcHJvY2Vzc2VkIGluZm9cbiAgICAgIGRlSW5pdE5vZGUoZWx0KVxuXG4gICAgICBub2RlRGF0YS5pbml0SGFzaCA9IGF0dHJpYnV0ZUhhc2goZWx0KVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpXG5cbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgaWYgKGVsdC52YWx1ZSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG5vZGVEYXRhLmxhc3RWYWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBnZXRUcmlnZ2VyU3BlY3MoZWx0KVxuICAgICAgY29uc3QgaGFzRXhwbGljaXRIdHRwQWN0aW9uID0gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcblxuICAgICAgaWYgKCFoYXNFeHBsaWNpdEh0dHBBY3Rpb24pIHtcbiAgICAgICAgaWYgKGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1ib29zdCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuICAgICAgICB9IGVsc2UgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC10cmlnZ2VyJykpIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgICAgLy8gRm9yIFwibmFrZWRcIiB0cmlnZ2VycywgZG9uJ3QgZG8gYW55dGhpbmcgYXQgYWxsXG4gICAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nIHx8IChnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JyAmJiBoYXNBdHRyaWJ1dGUoZWx0LCAnZm9ybScpKSkge1xuICAgICAgICBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclByb2Nlc3NOb2RlJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIG5ldyBjb250ZW50LCBlbmFibGluZyBodG14IGJlaGF2aW9yLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgY29udGVudCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBET00gb3V0c2lkZSBvZiB0aGUgbm9ybWFsIGh0bXggcmVxdWVzdCBjeWNsZSBidXQgc3RpbGwgd2FudCBodG14IGF0dHJpYnV0ZXMgdG8gd29yay5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcHJvY2Vzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgZWxlbWVudCB0byBwcm9jZXNzXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShlbHQpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpbml0Tm9kZShlbHQpXG4gICAgZm9yRWFjaChmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSwgZnVuY3Rpb24oY2hpbGQpIHsgaW5pdE5vZGUoY2hpbGQpIH0pXG4gICAgZm9yRWFjaChmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSwgcHJvY2Vzc0h4T25XaWxkY2FyZClcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV2ZW50L0xvZyBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRldGFpbFxuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgLy8gVGhpcyBicmVha3MgZXhwZWN0ZWQgZW5jYXBzdWxhdGlvbiBidXQgbmVlZHMgdG8gYmUgaGVyZSB1bnRpbCBkZWNpZGVkIG90aGVyd2lzZSBieSBjb3JlIGRldnNcbiAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBldnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsXG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXJyb3JFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZXZlbnROYW1lIH0sIGRldGFpbCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpIHtcbiAgICByZXR1cm4gZXZlbnROYW1lID09PSAnaHRteDphZnRlclByb2Nlc3NOb2RlJ1xuICB9XG5cbiAgLyoqXG4gICAqIGB3aXRoRXh0ZW5zaW9uc2AgbG9jYXRlcyBhbGwgYWN0aXZlIGV4dGVuc2lvbnMgZm9yIGEgcHJvdmlkZWQgZWxlbWVudCwgdGhlblxuICAgKiBleGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdXNpbmcgZWFjaCBvZiB0aGUgYWN0aXZlIGV4dGVuc2lvbnMuICBJdCBzaG91bGRcbiAgICogYmUgY2FsbGVkIGludGVybmFsbHkgYXQgZXZlcnkgZXh0ZW5kYWJsZSBleGVjdXRpb24gcG9pbnQgaW4gaHRteC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHsoZXh0ZW5zaW9uOkh0bXhFeHRlbnNpb24pID0+IHZvaWR9IHRvRG9cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aEV4dGVuc2lvbnMoZWx0LCB0b0RvKSB7XG4gICAgZm9yRWFjaChnZXRFeHRlbnNpb25zKGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9EbyhleHRlbnNpb24pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ0Vycm9yKG1zZykge1xuICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1zZylcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICBjb25zb2xlLmxvZygnRVJST1I6ICcsIG1zZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBnaXZlbiBldmVudCBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RyaWdnZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byB0cmlnZ2VyXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsIGRldGFpbHMgZm9yIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRldGFpbCA9PSBudWxsKSB7XG4gICAgICBkZXRhaWwgPSB7fVxuICAgIH1cbiAgICBkZXRhaWwuZWx0ID0gZWx0XG4gICAgY29uc3QgZXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgaWYgKGh0bXgubG9nZ2VyICYmICFpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSkge1xuICAgICAgaHRteC5sb2dnZXIoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICB9XG4gICAgaWYgKGRldGFpbC5lcnJvcikge1xuICAgICAgbG9nRXJyb3IoZGV0YWlsLmVycm9yKVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6ZXJyb3InLCB7IGVycm9ySW5mbzogZGV0YWlsIH0pXG4gICAgfVxuICAgIGxldCBldmVudFJlc3VsdCA9IGVsdC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGtlYmFiTmFtZSA9IGtlYmFiRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAgICBpZiAoZXZlbnRSZXN1bHQgJiYga2ViYWJOYW1lICE9PSBldmVudE5hbWUpIHtcbiAgICAgIGNvbnN0IGtlYmFiZWRFdmVudCA9IG1ha2VFdmVudChrZWJhYk5hbWUsIGV2ZW50LmRldGFpbClcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgZWx0LmRpc3BhdGNoRXZlbnQoa2ViYWJlZEV2ZW50KVxuICAgIH1cbiAgICB3aXRoRXh0ZW5zaW9ucyhhc0VsZW1lbnQoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIChleHRlbnNpb24ub25FdmVudChldmVudE5hbWUsIGV2ZW50KSAhPT0gZmFsc2UgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgfSlcbiAgICByZXR1cm4gZXZlbnRSZXN1bHRcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhpc3RvcnkgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsZXQgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAvKipcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRIaXN0b3J5RWxlbWVudCgpIHtcbiAgICBjb25zdCBoaXN0b3J5RWx0ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpXG4gICAgcmV0dXJuIGhpc3RvcnlFbHQgfHwgZ2V0RG9jdW1lbnQoKS5ib2R5XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbHRcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVUb0hpc3RvcnlDYWNoZSh1cmwsIHJvb3RFbHQpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgc3RhdGUgdG8gc2F2ZVxuICAgIGNvbnN0IGlubmVySFRNTCA9IGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShyb290RWx0KVxuICAgIGNvbnN0IHRpdGxlID0gZ2V0RG9jdW1lbnQoKS50aXRsZVxuICAgIGNvbnN0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSA8PSAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbiBldmVudHVhbGx5IGFscmVhZHkgZXhpc3RpbmcgY2FjaGUgaXMgcHVyZ2VkXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICBoaXN0b3J5Q2FjaGUuc3BsaWNlKGksIDEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIEh0bXhIaXN0b3J5SXRlbSAqL1xuICAgIGNvbnN0IG5ld0hpc3RvcnlJdGVtID0geyB1cmwsIGNvbnRlbnQ6IGlubmVySFRNTCwgdGl0bGUsIHNjcm9sbCB9XG5cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5SXRlbUNyZWF0ZWQnLCB7IGl0ZW06IG5ld0hpc3RvcnlJdGVtLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG5cbiAgICBoaXN0b3J5Q2FjaGUucHVzaChuZXdIaXN0b3J5SXRlbSlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUpIHtcbiAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpXG4gICAgfVxuXG4gICAgLy8ga2VlcCB0cnlpbmcgdG8gc2F2ZSB0aGUgY2FjaGUgdW50aWwgaXQgc3VjY2VlZHMgb3IgaXMgZW1wdHlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5Q2FjaGUpKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZUVycm9yJywgeyBjYXVzZTogZSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuICAgICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKSAvLyBzaHJpbmsgdGhlIGNhY2hlIGFuZCByZXRyeVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeUl0ZW1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNjcm9sbFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcmV0dXJucyB7SHRteEhpc3RvcnlJdGVtfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDYWNoZWRIaXN0b3J5KHVybCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIHJldHVybiBoaXN0b3J5Q2FjaGVbaV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KGVsdCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGh0bXguY29uZmlnLnJlcXVlc3RDbGFzc1xuICAgIGNvbnN0IGNsb25lID0gLyoqIEB0eXBlIEVsZW1lbnQgKi8gKGVsdC5jbG9uZU5vZGUodHJ1ZSkpXG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnLicgKyBjbGFzc05hbWUpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhc3NOYW1lKVxuICAgIH0pXG4gICAgLy8gcmVtb3ZlIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgZm9yIGFueSBlbGVtZW50IGRpc2FibGVkIGR1ZSB0byBhbiBodG14IHJlcXVlc3RcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICdbZGF0YS1kaXNhYmxlZC1ieS1odG14XScpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgfSlcbiAgICByZXR1cm4gY2xvbmUuaW5uZXJIVE1MXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKSB7XG4gICAgY29uc3QgZWx0ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50UGF0aEZvckhpc3RvcnkgfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAgIC8vIEFsbG93IGhpc3Rvcnkgc25hcHNob3QgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCB3aGVyZSBoeC1oaXN0b3J5PVwiZmFsc2VcIlxuICAgIC8vIGlzIHByZXNlbnQgKmFueXdoZXJlKiBpbiB0aGUgY3VycmVudCBkb2N1bWVudCB3ZSdyZSBhYm91dCB0byBzYXZlLFxuICAgIC8vIHNvIHdlIGNhbiBwcmV2ZW50IHByaXZpbGVnZWQgZGF0YSBlbnRlcmluZyB0aGUgY2FjaGUuXG4gICAgLy8gVGhlIHBhZ2Ugd2lsbCBzdGlsbCBiZSByZWFjaGFibGUgYXMgYSBoaXN0b3J5IGVudHJ5LCBidXQgaHRteCB3aWxsIGZldGNoIGl0XG4gICAgLy8gbGl2ZSBmcm9tIHRoZSBzZXJ2ZXIgb25wb3BzdGF0ZSByYXRoZXIgdGhhbiBsb29rIGluIHRoZSBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICBsZXQgZGlzYWJsZUhpc3RvcnlDYWNoZVxuICAgIHRyeSB7XG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0nKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJRTExOiBpbnNlbnNpdGl2ZSBtb2RpZmllciBub3Qgc3VwcG9ydGVkIHNvIGZhbGxiYWNrIHRvIGNhc2Ugc2Vuc2l0aXZlIHNlbGVjdG9yXG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCJdLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiXScpXG4gICAgfVxuICAgIGlmICghZGlzYWJsZUhpc3RvcnlDYWNoZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVNhdmUnLCB7IHBhdGgsIGhpc3RvcnlFbHQ6IGVsdCB9KVxuICAgICAgc2F2ZVRvSGlzdG9yeUNhY2hlKHBhdGgsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCBnZXREb2N1bWVudCgpLnRpdGxlLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcHVzaFVybEludG9IaXN0b3J5KHBhdGgpIHtcbiAgLy8gcmVtb3ZlIHRoZSBjYWNoZSBidXN0ZXIgcGFyYW1ldGVyLCBpZiBhbnlcbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvb3JnXFwuaHRteFxcLmNhY2hlLWJ1c3Rlcj1bXiZdKiY/LywgJycpXG4gICAgICBpZiAoZW5kc1dpdGgocGF0aCwgJyYnKSB8fCBlbmRzV2l0aChwYXRoLCAnPycpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIHtcbiAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICB9XG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlVXJsSW5IaXN0b3J5KHBhdGgpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0dGxlSW1tZWRpYXRlbHkodGFza3MpIHtcbiAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICB0YXNrLmNhbGwodW5kZWZpbmVkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgY29uc3QgZGV0YWlscyA9IHsgcGF0aCwgeGhyOiByZXF1ZXN0IH1cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzJywgZGV0YWlscylcbiAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1DdXJyZW50LVVSTCcsIGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZilcbiAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZCcsIGRldGFpbHMpXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KHRoaXMucmVzcG9uc2UpXG4gICAgICAgIC8qKiBAdHlwZSBQYXJlbnROb2RlICovXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpIHx8IGZyYWdtZW50XG4gICAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuXG4gICAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGNvbnRlbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGNhY2hlTWlzczogdHJ1ZSwgc2VydmVyUmVzcG9uc2U6IHRoaXMucmVzcG9uc2UgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWRFcnJvcicsIGRldGFpbHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3Quc2VuZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzdG9yZUhpc3RvcnkocGF0aCkge1xuICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgcGF0aCA9IHBhdGggfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRIaXN0b3J5KHBhdGgpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY2FjaGVkLmNvbnRlbnQpXG4gICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGNhY2hlZC5zY3JvbGwpXG4gICAgICB9LCAwKSAvLyBuZXh0ICd0aWNrJywgc28gYnJvd3NlciBoYXMgdGltZSB0byByZW5kZXIgbGF5b3V0XG4gICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgaXRlbTogY2FjaGVkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5yZWZyZXNoT25IaXN0b3J5TWlzcykge1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gcmVsb2FkKCkgZnVuY3Rpb24gdGhyb3dzIGVycm9yXG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpIHtcbiAgICBsZXQgaW5kaWNhdG9ycyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluZGljYXRvcicpKVxuICAgIGlmIChpbmRpY2F0b3JzID09IG51bGwpIHtcbiAgICAgIGluZGljYXRvcnMgPSBbZWx0XVxuICAgIH1cbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBpYy5jbGFzc0xpc3QuYWRkLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgfSlcbiAgICByZXR1cm4gaW5kaWNhdG9yc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBkaXNhYmxlRWxlbWVudHMoZWx0KSB7XG4gICAgbGV0IGRpc2FibGVkRWx0cyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWRpc2FibGVkLWVsdCcpKVxuICAgIGlmIChkaXNhYmxlZEVsdHMgPT0gbnVsbCkge1xuICAgICAgZGlzYWJsZWRFbHRzID0gW11cbiAgICB9XG4gICAgZm9yRWFjaChkaXNhYmxlZEVsdHMsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnLCAnJylcbiAgICB9KVxuICAgIHJldHVybiBkaXNhYmxlZEVsdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gaW5kaWNhdG9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVkKSB7XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgaWMuY2xhc3NMaXN0LnJlbW92ZS5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChkaXNhYmxlZCwgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnB1dCBWYWx1ZSBQcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IHByb2Nlc3NlZFtpXVxuICAgICAgaWYgKG5vZGUuaXNTYW1lTm9kZShlbHQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkSW5jbHVkZShlbGVtZW50KSB7XG4gICAgLy8gQ2FzdCB0byB0cmljayB0c2MsIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCB3b3JrIGZpbmUgaGVyZVxuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudH0gKi8gKGVsZW1lbnQpXG4gICAgaWYgKGVsdC5uYW1lID09PSAnJyB8fCBlbHQubmFtZSA9PSBudWxsIHx8IGVsdC5kaXNhYmxlZCB8fCBjbG9zZXN0KGVsdCwgJ2ZpZWxkc2V0W2Rpc2FibGVkXScpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgLy8gaWdub3JlIFwic3VibWl0dGVyXCIgdHlwZXMgKHNlZSBqUXVlcnkgc3JjL3NlcmlhbGl6ZS5qcylcbiAgICBpZiAoZWx0LnR5cGUgPT09ICdidXR0b24nIHx8IGVsdC50eXBlID09PSAnc3VibWl0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ltYWdlJyB8fCBlbHQudGFnTmFtZSA9PT0gJ3Jlc2V0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGVsdC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsdC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm4gZWx0LmNoZWNrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheXxGb3JtRGF0YUVudHJ5VmFsdWV9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxldCB2YWx1ZXMgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdmFsdWUuaW5kZXhPZih2KSA8IDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpXG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgIGZvckVhY2godmFsdWVzLCB2ID0+IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudHxIVE1MU2VsZWN0RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpIHtcbiAgICBpZiAoZWx0ID09IG51bGwgfHwgaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NlZC5wdXNoKGVsdClcbiAgICB9XG4gICAgaWYgKHNob3VsZEluY2x1ZGUoZWx0KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJylcbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgbGV0IHZhbHVlID0gZWx0LnZhbHVlXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgZWx0Lm11bHRpcGxlKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uOmNoZWNrZWQnKSkubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuICgvKiogQHR5cGUgSFRNTE9wdGlvbkVsZW1lbnQgKi8oZSkpLnZhbHVlIH0pXG4gICAgICB9XG4gICAgICAvLyBpbmNsdWRlIGZpbGUgaW5wdXRzXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbHQuZmlsZXMpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5maWxlcylcbiAgICAgIH1cbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGVsdC5lbGVtZW50cywgZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHByb2Nlc3NlZC5pbmRleE9mKGlucHV0KSA+PSAwKSB7XG4gICAgICAgICAgLy8gVGhlIGlucHV0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZCBhZGRlZCB0byB0aGUgdmFsdWVzLCBidXQgdGhlIEZvcm1EYXRhIHRoYXQgd2lsbCBiZVxuICAgICAgICAgIC8vICBjb25zdHJ1Y3RlZCByaWdodCBhZnRlciBvbiB0aGUgZm9ybSwgd2lsbCBpbmNsdWRlIGl0IG9uY2UgYWdhaW4uIFNvIHJlbW92ZSB0aGF0IGlucHV0J3MgdmFsdWVcbiAgICAgICAgICAvLyAgbm93IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShpbnB1dC5uYW1lLCBpbnB1dC52YWx1ZSwgZm9ybURhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1c2goaW5wdXQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgICAgdmFsaWRhdGVFbGVtZW50KGlucHV0LCBlcnJvcnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBuZXcgRm9ybURhdGEoZWx0KS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgJiYgdmFsdWUubmFtZSA9PT0gJycpIHtcbiAgICAgICAgICByZXR1cm4gLy8gaWdub3JlIG5vLW5hbWUgZmlsZXNcbiAgICAgICAgfVxuICAgICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICovXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50ICYgRWxlbWVudEludGVybmFsc30gKi8gKGVsdClcbiAgICBpZiAoZWxlbWVudC53aWxsVmFsaWRhdGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOnZhbGlkYXRlJylcbiAgICAgIGlmICghZWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBlbHQ6IGVsZW1lbnQsIG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOmZhaWxlZCcsIHsgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBvbmUgRm9ybURhdGEgd2l0aCB0aG9zZSBmcm9tIGFub3RoZXIuXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IHJlY2VpdmVyIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBkb25vciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIG92ZXJyaWRpbmcgdmFsdWVzXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX0gdGhlIHtAbGlua2NvZGUgcmVjZWl2ZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvdmVycmlkZUZvcm1EYXRhKHJlY2VpdmVyLCBkb25vcikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGRvbm9yLmtleXMoKSkge1xuICAgICAgcmVjZWl2ZXIuZGVsZXRlKGtleSlcbiAgICB9XG4gICAgZG9ub3IuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZWNlaXZlci5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZWNlaXZlclxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEByZXR1cm5zIHt7ZXJyb3JzOiBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdLCBmb3JtRGF0YTogRm9ybURhdGEsIHZhbHVlczogT2JqZWN0fX1cbiAqL1xuICBmdW5jdGlvbiBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpIHtcbiAgICAvKiogQHR5cGUgRWxlbWVudFtdICovXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gW11cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgY29uc3QgcHJpb3JpdHlGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgLyoqIEB0eXBlIEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCAmJiAhYm9keUNvbnRhaW5zKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBvbmx5IHZhbGlkYXRlIHdoZW4gZm9ybSBpcyBkaXJlY3RseSBzdWJtaXR0ZWQgYW5kIG5vdmFsaWRhdGUgb3IgZm9ybW5vdmFsaWRhdGUgYXJlIG5vdCBzZXRcbiAgICAvLyBvciBpZiB0aGUgZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgaHgtdmFsaWRhdGU9XCJ0cnVlXCIgb24gaXRcbiAgICBsZXQgdmFsaWRhdGUgPSAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmIGVsdC5ub1ZhbGlkYXRlICE9PSB0cnVlKSB8fCBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC12YWxpZGF0ZScpID09PSAndHJ1ZSdcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSB7XG4gICAgICB2YWxpZGF0ZSA9IHZhbGlkYXRlICYmIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZC5mb3JtTm9WYWxpZGF0ZSAhPT0gdHJ1ZVxuICAgIH1cblxuICAgIC8vIGZvciBhIG5vbi1HRVQgaW5jbHVkZSB0aGUgY2xvc2VzdCBmb3JtXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIHByaW9yaXR5Rm9ybURhdGEsIGVycm9ycywgY2xvc2VzdChlbHQsICdmb3JtJyksIHZhbGlkYXRlKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKVxuXG4gICAgLy8gaWYgYSBidXR0b24gb3Igc3VibWl0IHdhcyBjbGlja2VkIGxhc3QsIGluY2x1ZGUgaXRzIHZhbHVlXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCBlbHQudGFnTmFtZSA9PT0gJ0JVVFRPTicgfHxcbiAgICAoZWx0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcpKSB7XG4gICAgICBjb25zdCBidXR0b24gPSBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgKC8qKiBAdHlwZSBIVE1MSW5wdXRFbGVtZW50fEhUTUxCdXR0b25FbGVtZW50ICovKGVsdCkpXG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGJ1dHRvbiwgJ25hbWUnKVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIGJ1dHRvbi52YWx1ZSwgcHJpb3JpdHlGb3JtRGF0YSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIGFueSBleHBsaWNpdCBpbmNsdWRlc1xuICAgIGNvbnN0IGluY2x1ZGVzID0gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5jbHVkZScpXG4gICAgZm9yRWFjaChpbmNsdWRlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBhc0VsZW1lbnQobm9kZSksIHZhbGlkYXRlKVxuICAgICAgLy8gaWYgYSBub24tZm9ybSBpcyBpbmNsdWRlZCwgaW5jbHVkZSBhbnkgaW5wdXQgdmFsdWVzIHdpdGhpbiBpdFxuICAgICAgaWYgKCFtYXRjaGVzKG5vZGUsICdmb3JtJykpIHtcbiAgICAgICAgZm9yRWFjaChhc1BhcmVudE5vZGUobm9kZSkucXVlcnlTZWxlY3RvckFsbChJTlBVVF9TRUxFQ1RPUiksIGZ1bmN0aW9uKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGRlc2NlbmRhbnQsIHZhbGlkYXRlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyB2YWx1ZXMgZnJvbSBhIDxmb3JtPiB0YWtlIHByZWNlZGVuY2UsIG92ZXJyaWRpbmcgdGhlIHJlZ3VsYXIgdmFsdWVzXG4gICAgb3ZlcnJpZGVGb3JtRGF0YShmb3JtRGF0YSwgcHJpb3JpdHlGb3JtRGF0YSlcblxuICAgIHJldHVybiB7IGVycm9ycywgZm9ybURhdGEsIHZhbHVlczogZm9ybURhdGFQcm94eShmb3JtRGF0YSkgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXR1cm5TdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHthbnl9IHJlYWxWYWx1ZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBuYW1lLCByZWFsVmFsdWUpIHtcbiAgICBpZiAocmV0dXJuU3RyICE9PSAnJykge1xuICAgICAgcmV0dXJuU3RyICs9ICcmJ1xuICAgIH1cbiAgICBpZiAoU3RyaW5nKHJlYWxWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZWFsVmFsdWUgPSBKU09OLnN0cmluZ2lmeShyZWFsVmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IHMgPSBlbmNvZGVVUklDb21wb25lbnQocmVhbFZhbHVlKVxuICAgIHJldHVyblN0ciArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBzXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF8T2JqZWN0fSB2YWx1ZXNcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBmdW5jdGlvbiB1cmxFbmNvZGUodmFsdWVzKSB7XG4gICAgdmFsdWVzID0gZm9ybURhdGFGcm9tT2JqZWN0KHZhbHVlcylcbiAgICBsZXQgcmV0dXJuU3RyID0gJydcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm5TdHIgPSBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBamF4XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9tcHRcbiAqIEByZXR1cm5zIHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHQpIHtcbiAgICAvKiogQHR5cGUgSHRteEhlYWRlclNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgJ0hYLVJlcXVlc3QnOiAndHJ1ZScsXG4gICAgICAnSFgtVHJpZ2dlcic6IGdldFJhd0F0dHJpYnV0ZShlbHQsICdpZCcpLFxuICAgICAgJ0hYLVRyaWdnZXItTmFtZSc6IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJyksXG4gICAgICAnSFgtVGFyZ2V0JzogZ2V0QXR0cmlidXRlVmFsdWUodGFyZ2V0LCAnaWQnKSxcbiAgICAgICdIWC1DdXJyZW50LVVSTCc6IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cbiAgICBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LWhlYWRlcnMnLCBmYWxzZSwgaGVhZGVycylcbiAgICBpZiAocHJvbXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLVByb21wdCddID0gcHJvbXB0XG4gICAgfVxuICAgIGlmIChnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Cb29zdGVkJ10gPSAndHJ1ZSdcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIC8qKlxuICogZmlsdGVyVmFsdWVzIHRha2VzIGFuIG9iamVjdCBjb250YWluaW5nIGZvcm0gaW5wdXQgdmFsdWVzXG4gKiBhbmQgcmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBvbmx5IGNvbnRhaW5zIGtleXMgdGhhdCBhcmVcbiAqIHNwZWNpZmllZCBieSB0aGUgY2xvc2VzdCBcImh4LXBhcmFtc1wiIGF0dHJpYnV0ZVxuICogQHBhcmFtIHtGb3JtRGF0YX0gaW5wdXRWYWx1ZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZmlsdGVyVmFsdWVzKGlucHV0VmFsdWVzLCBlbHQpIHtcbiAgICBjb25zdCBwYXJhbXNWYWx1ZSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wYXJhbXMnKVxuICAgIGlmIChwYXJhbXNWYWx1ZSkge1xuICAgICAgaWYgKHBhcmFtc1ZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlLmluZGV4T2YoJ25vdCAnKSA9PT0gMCkge1xuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnN1YnN0cig0KS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaW5wdXRWYWx1ZXMuZGVsZXRlKG5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaWYgKGlucHV0VmFsdWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZXMuZ2V0QWxsKG5hbWUpLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHsgbmV3VmFsdWVzLmFwcGVuZChuYW1lLCB2YWx1ZSkgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBuZXdWYWx1ZXNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0FuY2hvckxpbmsoZWx0KSB7XG4gICAgcmV0dXJuICEhZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSA+PSAwXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IFtzd2FwSW5mb092ZXJyaWRlXVxuICogQHJldHVybnMge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBJbmZvT3ZlcnJpZGUpIHtcbiAgICBjb25zdCBzd2FwSW5mbyA9IHN3YXBJbmZvT3ZlcnJpZGUgfHwgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN3YXAnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBzd2FwU3BlYyA9IHtcbiAgICAgIHN3YXBTdHlsZTogZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCA/ICdpbm5lckhUTUwnIDogaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSxcbiAgICAgIHN3YXBEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFN3YXBEZWxheSxcbiAgICAgIHNldHRsZURlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U2V0dGxlRGVsYXlcbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLnNjcm9sbEludG9WaWV3T25Cb29zdCAmJiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmICFpc0FuY2hvckxpbmsoZWx0KSkge1xuICAgICAgc3dhcFNwZWMuc2hvdyA9ICd0b3AnXG4gICAgfVxuICAgIGlmIChzd2FwSW5mbykge1xuICAgICAgY29uc3Qgc3BsaXQgPSBzcGxpdE9uV2hpdGVzcGFjZShzd2FwSW5mbylcbiAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNwbGl0W2ldXG4gICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ3N3YXA6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDUpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2V0dGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zZXR0bGVEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDcpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZigndHJhbnNpdGlvbjonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMudHJhbnNpdGlvbiA9IHZhbHVlLnN1YnN0cigxMSkgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignaWdub3JlVGl0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gdmFsdWUuc3Vic3RyKDEyKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFNwZWMgPSB2YWx1ZS5zdWJzdHIoNylcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzY3JvbGxTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsID0gc2Nyb2xsVmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGxUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2hvdzonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2hvd1NwZWMgPSB2YWx1ZS5zdWJzdHIoNSlcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzaG93U3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzaG93VmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93ID0gc2hvd1ZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvd1RhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdmb2N1cy1zY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzU2Nyb2xsVmFsID0gdmFsdWUuc3Vic3RyKCdmb2N1cy1zY3JvbGw6Jy5sZW5ndGgpXG4gICAgICAgICAgICBzd2FwU3BlYy5mb2N1c1Njcm9sbCA9IGZvY3VzU2Nyb2xsVmFsID09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwU3R5bGUgPSB2YWx1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dFcnJvcignVW5rbm93biBtb2RpZmllciBpbiBoeC1zd2FwOiAnICsgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3BlY1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB1c2VzRm9ybURhdGEoZWx0KSB7XG4gICAgcmV0dXJuIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1lbmNvZGluZycpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfHxcbiAgICAobWF0Y2hlcyhlbHQsICdmb3JtJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2VuY3R5cGUnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmaWx0ZXJlZFBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgeyp8c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZFBhcmFtZXRlcnMpIHtcbiAgICBsZXQgZW5jb2RlZFBhcmFtZXRlcnMgPSBudWxsXG4gICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyA9PSBudWxsKSB7XG4gICAgICAgIGVuY29kZWRQYXJhbWV0ZXJzID0gZXh0ZW5zaW9uLmVuY29kZVBhcmFtZXRlcnMoeGhyLCBmaWx0ZXJlZFBhcmFtZXRlcnMsIGVsdClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5jb2RlZFBhcmFtZXRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbnZlcnNpb24gdG8gYW4gYWN0dWFsIEZvcm1EYXRhIG9iamVjdCBpbiBjYXNlIGZpbHRlcmVkUGFyYW1ldGVycyBpcyBhIGZvcm1EYXRhUHJveHlcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14L2lzc3Vlcy8yMzE3XG4gICAgICAgIHJldHVybiBvdmVycmlkZUZvcm1EYXRhKG5ldyBGb3JtRGF0YSgpLCBmb3JtRGF0YUZyb21PYmplY3QoZmlsdGVyZWRQYXJhbWV0ZXJzKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmxFbmNvZGUoZmlsdGVyZWRQYXJhbWV0ZXJzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7SHRteFNldHRsZUluZm99XG4gKi9cbiAgZnVuY3Rpb24gbWFrZVNldHRsZUluZm8odGFyZ2V0KSB7XG4gICAgcmV0dXJuIHsgdGFza3M6IFtdLCBlbHRzOiBbdGFyZ2V0XSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxTdGF0ZShjb250ZW50LCBzd2FwU3BlYykge1xuICAgIGNvbnN0IGZpcnN0ID0gY29udGVudFswXVxuICAgIGNvbnN0IGxhc3QgPSBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV1cbiAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbFRhcmdldCkge1xuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gMFxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gdGFyZ2V0LnNjcm9sbEhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3dhcFNwZWMuc2hvdykge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0KSB7XG4gICAgICAgIGxldCB0YXJnZXRTdHIgPSBzd2FwU3BlYy5zaG93VGFyZ2V0XG4gICAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0ID09PSAnd2luZG93Jykge1xuICAgICAgICAgIHRhcmdldFN0ciA9ICdib2R5J1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCB0YXJnZXRTdHIpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBldmFsQXNEZWZhdWx0XG4gKiBAcGFyYW0ge09iamVjdD19IHZhbHVlc1xuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICB2YWx1ZXMgPSB7fVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZXNcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgICBsZXQgc3RyID0gYXR0cmlidXRlVmFsdWUudHJpbSgpXG4gICAgICBsZXQgZXZhbHVhdGVWYWx1ZSA9IGV2YWxBc0RlZmF1bHRcbiAgICAgIGlmIChzdHIgPT09ICd1bnNldCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDExKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdHIuaW5kZXhPZignanM6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigzKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCd7JykgIT09IDApIHtcbiAgICAgICAgc3RyID0gJ3snICsgc3RyICsgJ30nXG4gICAgICB9XG4gICAgICBsZXQgdmFyc1ZhbHVlc1xuICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkgeyByZXR1cm4gRnVuY3Rpb24oJ3JldHVybiAoJyArIHN0ciArICcpJykoKSB9LCB7fSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBwYXJzZUpTT04oc3RyKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFyc1ZhbHVlcykge1xuICAgICAgICBpZiAodmFyc1ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gdmFyc1ZhbHVlc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7KCkgPT4gYW55fSB0b0V2YWxcbiAgICogQHBhcmFtIHthbnk9fSBkZWZhdWx0VmFsXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUV2YWwoZWx0LCB0b0V2YWwsIGRlZmF1bHRWYWwpIHtcbiAgICBpZiAoaHRteC5jb25maWcuYWxsb3dFdmFsKSB7XG4gICAgICByZXR1cm4gdG9FdmFsKClcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpldmFsRGlzYWxsb3dlZEVycm9yJylcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFycycsIHRydWUsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFscycsIGZhbHNlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBnZXRFeHByZXNzaW9uVmFycyhlbHQpIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3RzKGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0KSwgZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGhlYWRlclZhbHVlXG4gICAqL1xuICBmdW5jdGlvbiBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpIHtcbiAgICBpZiAoaGVhZGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBPbiBhbiBleGNlcHRpb24sIHRyeSB0byBzZXQgdGhlIGhlYWRlciBVUkkgZW5jb2RlZCBpbnN0ZWFkXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgZW5jb2RlVVJJQ29tcG9uZW50KGhlYWRlclZhbHVlKSlcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyICsgJy1VUkktQXV0b0VuY29kZWQnLCAndHJ1ZScpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocikge1xuICAvLyBOQjogSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgc3R1ZmZcbiAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICYmIHR5cGVvZiAoVVJMKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoeGhyLnJlc3BvbnNlVVJMKVxuICAgICAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJhZFJlc3BvbnNlVXJsJywgeyB1cmw6IHhoci5yZXNwb25zZVVSTCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzSGVhZGVyKHhociwgcmVnZXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cC50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZXMgYW4gaHRteC1zdHlsZSBBSkFYIHJlcXVlc3RcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWpheFxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBVUkwgcGF0aCB0byBtYWtlIHRoZSBBSkFYXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd8SHRteEFqYXhIZWxwZXJDb250ZXh0fSBjb250ZXh0IHRoZSBlbGVtZW50IHRvIHRhcmdldCAoZGVmYXVsdHMgdG8gdGhlICoqYm9keSoqKSB8IGEgc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgfCBhIGNvbnRleHQgb2JqZWN0IHRoYXQgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmdcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5IGlmIG5vIHJlcXVlc3QgaXMgc2VudCwgb3Igd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgZnVuY3Rpb24gYWpheEhlbHBlcih2ZXJiLCBwYXRoLCBjb250ZXh0KSB7XG4gICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8odmVyYi50b0xvd2VyQ2FzZSgpKSlcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dCksXG4gICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgcmVzb2x2ZVRhcmdldChjb250ZXh0LnNvdXJjZSksIGNvbnRleHQuZXZlbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGFuZGxlcjogY29udGV4dC5oYW5kbGVyLFxuICAgICAgICAgICAgaGVhZGVyczogY29udGV4dC5oZWFkZXJzLFxuICAgICAgICAgICAgdmFsdWVzOiBjb250ZXh0LnZhbHVlcyxcbiAgICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQudGFyZ2V0KSxcbiAgICAgICAgICAgIHN3YXBPdmVycmlkZTogY29udGV4dC5zd2FwLFxuICAgICAgICAgICAgc2VsZWN0OiBjb250ZXh0LnNlbGVjdCxcbiAgICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGhpZXJhcmNoeUZvckVsdChlbHQpIHtcbiAgICBjb25zdCBhcnIgPSBbXVxuICAgIHdoaWxlIChlbHQpIHtcbiAgICAgIGFyci5wdXNoKGVsdClcbiAgICAgIGVsdCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB2ZXJpZnlQYXRoKGVsdCwgcGF0aCwgcmVxdWVzdENvbmZpZykge1xuICAgIGxldCBzYW1lSG9zdFxuICAgIGxldCB1cmxcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXJsID0gbmV3IFVSTChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKVxuICAgICAgY29uc3Qgb3JpZ2luID0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgICBzYW1lSG9zdCA9IG9yaWdpbiA9PT0gdXJsLm9yaWdpblxuICAgIH0gZWxzZSB7XG4gICAgLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgVVJMXG4gICAgICB1cmwgPSBwYXRoXG4gICAgICBzYW1lSG9zdCA9IHN0YXJ0c1dpdGgocGF0aCwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5zZWxmUmVxdWVzdHNPbmx5KSB7XG4gICAgICBpZiAoIXNhbWVIb3N0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGVVcmwnLCBtZXJnZU9iamVjdHMoeyB1cmwsIHNhbWVIb3N0IH0sIHJlcXVlc3RDb25maWcpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZvcm1EYXRhfSBvYmpcbiAgICogQHJldHVybiB7Rm9ybURhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvcm1EYXRhKSByZXR1cm4gb2JqXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0uZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9ialtrZXldLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgIShvYmpba2V5XSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgSlNPTi5zdHJpbmdpZnkob2JqW2tleV0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhQXJyYXlQcm94eShmb3JtRGF0YSwgbmFtZSwgYXJyYXkpIHtcbiAgICAvLyBtdXRhdGluZyB0aGUgYXJyYXkgc2hvdWxkIG11dGF0ZSB0aGUgdW5kZXJseWluZyBmb3JtIGRhdGFcbiAgICByZXR1cm4gbmV3IFByb3h5KGFycmF5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIGlmIChrZXkgPT09ICdsZW5ndGgnKSByZXR1cm4gdGFyZ2V0Lmxlbmd0aFxuICAgICAgICBpZiAoa2V5ID09PSAncHVzaCcpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpXG4gICAgICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldFtrZXldICYmIHRhcmdldFtrZXldLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFQcm94eShmb3JtRGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZm9ybURhdGEsIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHN5bWJvbCBjYWxscyB0byB0aGUgRm9ybURhdGEgaXRzZWxmIGRpcmVjdGx5XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgbmFtZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ3RvSlNPTicpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IEpTT04uc3RyaW5naWZ5IGNhbGwgb24gcHJveHlcbiAgICAgICAgICByZXR1cm4gKCkgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lIGluIHRhcmdldCkge1xuICAgICAgICAgIC8vIFdyYXAgaW4gZnVuY3Rpb24gd2l0aCBhcHBseSB0byBjb3JyZWN0bHkgYmluZCB0aGUgRm9ybURhdGEgY29udGV4dCwgYXMgYSBkaXJlY3QgY2FsbCB3b3VsZCByZXN1bHQgaW4gYW4gaWxsZWdhbCBpbnZvY2F0aW9uIGVycm9yXG4gICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcm1EYXRhW25hbWVdLmFwcGx5KGZvcm1EYXRhLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXkgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgICAgLy8gVGhvc2UgMiB1bmRlZmluZWQgJiBzaW5nbGUgdmFsdWUgcmV0dXJucyBhcmUgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkgYXMgd2Ugd2VyZW4ndCB1c2luZyBGb3JtRGF0YSBiZWZvcmVcbiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gYXJyYXlbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZm9ybURhdGFBcnJheVByb3h5KHRhcmdldCwgbmFtZSwgYXJyYXkpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IHRhcmdldC5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEodmFsdWUgaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICAvLyBTdXBwb3J0IE9iamVjdC5hc3NpZ24gY2FsbCBmcm9tIHByb3h5XG4gICAgICBvd25LZXlzOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSlcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRhcmdldCwgcHJvcCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCksIHByb3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7SHRteEFqYXhFdGN9IFtldGNdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmZpcm1lZF1cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCBjb25maXJtZWQpIHtcbiAgICBsZXQgcmVzb2x2ZSA9IG51bGxcbiAgICBsZXQgcmVqZWN0ID0gbnVsbFxuICAgIGV0YyA9IGV0YyAhPSBudWxsID8gZXRjIDoge31cbiAgICBpZiAoZXRjLnJldHVyblByb21pc2UgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICByZWplY3QgPSBfcmVqZWN0XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIGVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZUhhbmRsZXIgPSBldGMuaGFuZGxlciB8fCBoYW5kbGVBamF4UmVzcG9uc2VcbiAgICBjb25zdCBzZWxlY3QgPSBldGMuc2VsZWN0IHx8IG51bGxcblxuICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAvLyBkbyBub3QgaXNzdWUgcmVxdWVzdHMgZm9yIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV0Yy50YXJnZXRPdmVycmlkZSB8fCBhc0VsZW1lbnQoZ2V0VGFyZ2V0KGVsdCkpXG4gICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IHRhcmdldCA9PSBEVU1NWV9FTFQpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGFyZ2V0RXJyb3InLCB7IHRhcmdldDogZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JykgfSlcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGxldCBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBjb25zdCBzdWJtaXR0ZXIgPSBlbHREYXRhLmxhc3RCdXR0b25DbGlja2VkXG5cbiAgICBpZiAoc3VibWl0dGVyKSB7XG4gICAgICBjb25zdCBidXR0b25QYXRoID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1hY3Rpb24nKVxuICAgICAgaWYgKGJ1dHRvblBhdGggIT0gbnVsbCkge1xuICAgICAgICBwYXRoID0gYnV0dG9uUGF0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25WZXJiID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1tZXRob2QnKVxuICAgICAgaWYgKGJ1dHRvblZlcmIgIT0gbnVsbCkge1xuICAgICAgLy8gaWdub3JlIGJ1dHRvbnMgd2l0aCBmb3JtbWV0aG9kPVwiZGlhbG9nXCJcbiAgICAgICAgaWYgKGJ1dHRvblZlcmIudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyhidXR0b25WZXJiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm1RdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1jb25maXJtJylcbiAgICAvLyBhbGxvdyBldmVudC1iYXNlZCBjb25maXJtYXRpb24gdy8gYSBjYWxsYmFja1xuICAgIGlmIChjb25maXJtZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNzdWVSZXF1ZXN0ID0gZnVuY3Rpb24oc2tpcENvbmZpcm1hdGlvbikge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsICEhc2tpcENvbmZpcm1hdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpcm1EZXRhaWxzID0geyB0YXJnZXQsIGVsdCwgcGF0aCwgdmVyYiwgdHJpZ2dlcmluZ0V2ZW50OiBldmVudCwgZXRjLCBpc3N1ZVJlcXVlc3QsIHF1ZXN0aW9uOiBjb25maXJtUXVlc3Rpb24gfVxuICAgICAgaWYgKHRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpcm0nLCBjb25maXJtRGV0YWlscykgPT09IGZhbHNlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzeW5jRWx0ID0gZWx0XG4gICAgbGV0IHN5bmNTdHJhdGVneSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zeW5jJylcbiAgICBsZXQgcXVldWVTdHJhdGVneSA9IG51bGxcbiAgICBsZXQgYWJvcnRhYmxlID0gZmFsc2VcbiAgICBpZiAoc3luY1N0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBzeW5jU3RyaW5ncyA9IHN5bmNTdHJhdGVneS5zcGxpdCgnOicpXG4gICAgICBjb25zdCBzZWxlY3RvciA9IHN5bmNTdHJpbmdzWzBdLnRyaW0oKVxuICAgICAgaWYgKHNlbGVjdG9yID09PSAndGhpcycpIHtcbiAgICAgICAgc3luY0VsdCA9IGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC1zeW5jJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN5bmNFbHQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHNlbGVjdG9yKSlcbiAgICAgIH1cbiAgICAgIC8vIGRlZmF1bHQgdG8gdGhlIGRyb3Agc3RyYXRlZ3lcbiAgICAgIHN5bmNTdHJhdGVneSA9IChzeW5jU3RyaW5nc1sxXSB8fCAnZHJvcCcpLnRyaW0oKVxuICAgICAgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShzeW5jRWx0KVxuICAgICAgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Ryb3AnICYmIGVsdERhdGEueGhyICYmIGVsdERhdGEuYWJvcnRhYmxlICE9PSB0cnVlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdhYm9ydCcpIHtcbiAgICAgICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhYm9ydGFibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAncmVwbGFjZScpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5LmluZGV4T2YoJ3F1ZXVlJykgPT09IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVTdHJBcnJheSA9IHN5bmNTdHJhdGVneS5zcGxpdCgnICcpXG4gICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAocXVldWVTdHJBcnJheVsxXSB8fCAnbGFzdCcpLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgaWYgKGVsdERhdGEuYWJvcnRhYmxlKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZlbnQpXG4gICAgICAgICAgICBpZiAoZXZlbnREYXRhICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyAmJiBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWUpIHtcbiAgICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9IGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gJ2xhc3QnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID09IG51bGwpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2ZpcnN0JyAmJiBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdsYXN0Jykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXSAvLyBkdW1wIGV4aXN0aW5nIHF1ZXVlXG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGVsdERhdGEueGhyID0geGhyXG4gICAgZWx0RGF0YS5hYm9ydGFibGUgPSBhYm9ydGFibGVcbiAgICBjb25zdCBlbmRSZXF1ZXN0TG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWx0RGF0YS54aHIgPSBudWxsXG4gICAgICBlbHREYXRhLmFib3J0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyAhPSBudWxsICYmXG4gICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVkUmVxdWVzdCA9IGVsdERhdGEucXVldWVkUmVxdWVzdHMuc2hpZnQoKVxuICAgICAgICBxdWV1ZWRSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvbXB0UXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHJvbXB0JylcbiAgICBpZiAocHJvbXB0UXVlc3Rpb24pIHtcbiAgICAgIHZhciBwcm9tcHRSZXNwb25zZSA9IHByb21wdChwcm9tcHRRdWVzdGlvbilcbiAgICAgIC8vIHByb21wdCByZXR1cm5zIG51bGwgaWYgY2FuY2VsbGVkIGFuZCBlbXB0eSBzdHJpbmcgaWYgYWNjZXB0ZWQgd2l0aCBubyBlbnRyeVxuICAgICAgaWYgKHByb21wdFJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgICAhdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cHJvbXB0JywgeyBwcm9tcHQ6IHByb21wdFJlc3BvbnNlLCB0YXJnZXQgfSkpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybVF1ZXN0aW9uICYmICFjb25maXJtZWQpIHtcbiAgICAgIGlmICghY29uZmlybShjb25maXJtUXVlc3Rpb24pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHRSZXNwb25zZSlcblxuICAgIGlmICh2ZXJiICE9PSAnZ2V0JyAmJiAhdXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICB9XG5cbiAgICBpZiAoZXRjLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMgPSBtZXJnZU9iamVjdHMoaGVhZGVycywgZXRjLmhlYWRlcnMpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpXG4gICAgbGV0IGVycm9ycyA9IHJlc3VsdHMuZXJyb3JzXG4gICAgY29uc3QgcmF3Rm9ybURhdGEgPSByZXN1bHRzLmZvcm1EYXRhXG4gICAgaWYgKGV0Yy52YWx1ZXMpIHtcbiAgICAgIG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGZvcm1EYXRhRnJvbU9iamVjdChldGMudmFsdWVzKSlcbiAgICB9XG4gICAgY29uc3QgZXhwcmVzc2lvblZhcnMgPSBmb3JtRGF0YUZyb21PYmplY3QoZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSlcbiAgICBjb25zdCBhbGxGb3JtRGF0YSA9IG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGV4cHJlc3Npb25WYXJzKVxuICAgIGxldCBmaWx0ZXJlZEZvcm1EYXRhID0gZmlsdGVyVmFsdWVzKGFsbEZvcm1EYXRhLCBlbHQpXG5cbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSAmJiB2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgZmlsdGVyZWRGb3JtRGF0YS5zZXQoJ29yZy5odG14LmNhY2hlLWJ1c3RlcicsIGdldFJhd0F0dHJpYnV0ZSh0YXJnZXQsICdpZCcpIHx8ICd0cnVlJylcbiAgICB9XG5cbiAgICAvLyBiZWhhdmlvciBvZiBhbmNob3JzIHcvIGVtcHR5IGhyZWYgaXMgdG8gdXNlIHRoZSBjdXJyZW50IFVSTFxuICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aCA9PT0gJycpIHtcbiAgICAgIHBhdGggPSBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtub0hlYWRlcnNdXG4gICAgICovXG4gICAgY29uc3QgcmVxdWVzdEF0dHJWYWx1ZXMgPSBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXJlcXVlc3QnKVxuXG4gICAgY29uc3QgZWx0SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHVzZVVybFBhcmFtcyA9IGh0bXguY29uZmlnLm1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zLmluZGV4T2YodmVyYikgPj0gMFxuXG4gICAgLyoqIEB0eXBlIEh0bXhSZXF1ZXN0Q29uZmlnICovXG4gICAgY29uc3QgcmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHVzZVVybFBhcmFtcyxcbiAgICAgIGZvcm1EYXRhOiBmaWx0ZXJlZEZvcm1EYXRhLFxuICAgICAgcGFyYW1ldGVyczogZm9ybURhdGFQcm94eShmaWx0ZXJlZEZvcm1EYXRhKSxcbiAgICAgIHVuZmlsdGVyZWRGb3JtRGF0YTogYWxsRm9ybURhdGEsXG4gICAgICB1bmZpbHRlcmVkUGFyYW1ldGVyczogZm9ybURhdGFQcm94eShhbGxGb3JtRGF0YSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdmVyYixcbiAgICAgIGVycm9ycyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogZXRjLmNyZWRlbnRpYWxzIHx8IHJlcXVlc3RBdHRyVmFsdWVzLmNyZWRlbnRpYWxzIHx8IGh0bXguY29uZmlnLndpdGhDcmVkZW50aWFscyxcbiAgICAgIHRpbWVvdXQ6IGV0Yy50aW1lb3V0IHx8IHJlcXVlc3RBdHRyVmFsdWVzLnRpbWVvdXQgfHwgaHRteC5jb25maWcudGltZW91dCxcbiAgICAgIHBhdGgsXG4gICAgICB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50XG4gICAgfVxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maWdSZXF1ZXN0JywgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICAvLyBjb3B5IG91dCBpbiBjYXNlIHRoZSBvYmplY3Qgd2FzIG92ZXJ3cml0dGVuXG4gICAgcGF0aCA9IHJlcXVlc3RDb25maWcucGF0aFxuICAgIHZlcmIgPSByZXF1ZXN0Q29uZmlnLnZlcmJcbiAgICBoZWFkZXJzID0gcmVxdWVzdENvbmZpZy5oZWFkZXJzXG4gICAgZmlsdGVyZWRGb3JtRGF0YSA9IGZvcm1EYXRhRnJvbU9iamVjdChyZXF1ZXN0Q29uZmlnLnBhcmFtZXRlcnMpXG4gICAgZXJyb3JzID0gcmVxdWVzdENvbmZpZy5lcnJvcnNcbiAgICB1c2VVcmxQYXJhbXMgPSByZXF1ZXN0Q29uZmlnLnVzZVVybFBhcmFtc1xuXG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGlvbjpoYWx0ZWQnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0UGF0aCA9IHBhdGguc3BsaXQoJyMnKVxuICAgIGNvbnN0IHBhdGhOb0FuY2hvciA9IHNwbGl0UGF0aFswXVxuICAgIGNvbnN0IGFuY2hvciA9IHNwbGl0UGF0aFsxXVxuXG4gICAgbGV0IGZpbmFsUGF0aCA9IHBhdGhcbiAgICBpZiAodXNlVXJsUGFyYW1zKSB7XG4gICAgICBmaW5hbFBhdGggPSBwYXRoTm9BbmNob3JcbiAgICAgIGNvbnN0IGhhc1ZhbHVlcyA9ICFmaWx0ZXJlZEZvcm1EYXRhLmtleXMoKS5uZXh0KCkuZG9uZVxuICAgICAgaWYgKGhhc1ZhbHVlcykge1xuICAgICAgICBpZiAoZmluYWxQYXRoLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJz8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcmJ1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsUGF0aCArPSB1cmxFbmNvZGUoZmlsdGVyZWRGb3JtRGF0YSlcbiAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnIycgKyBhbmNob3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdmVyaWZ5UGF0aChlbHQsIGZpbmFsUGF0aCwgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6aW52YWxpZFBhdGgnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgeGhyLm9wZW4odmVyYi50b1VwcGVyQ2FzZSgpLCBmaW5hbFBhdGgsIHRydWUpXG4gICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvaHRtbCcpXG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHJlcXVlc3RDb25maWcud2l0aENyZWRlbnRpYWxzXG4gICAgeGhyLnRpbWVvdXQgPSByZXF1ZXN0Q29uZmlnLnRpbWVvdXRcblxuICAgIC8vIHJlcXVlc3QgaGVhZGVyc1xuICAgIGlmIChyZXF1ZXN0QXR0clZhbHVlcy5ub0hlYWRlcnMpIHtcbiAgICAvLyBpZ25vcmUgYWxsIGhlYWRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlcl1cbiAgICAgICAgICBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0h0bXhSZXNwb25zZUluZm99ICovXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvID0ge1xuICAgICAgeGhyLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcmVxdWVzdENvbmZpZyxcbiAgICAgIGV0YyxcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHNlbGVjdCxcbiAgICAgIHBhdGhJbmZvOiB7XG4gICAgICAgIHJlcXVlc3RQYXRoOiBwYXRoLFxuICAgICAgICBmaW5hbFJlcXVlc3RQYXRoOiBmaW5hbFBhdGgsXG4gICAgICAgIHJlc3BvbnNlUGF0aDogbnVsbCxcbiAgICAgICAgYW5jaG9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGllcmFyY2h5ID0gaGllcmFyY2h5Rm9yRWx0KGVsdClcbiAgICAgICAgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aCA9IGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKVxuICAgICAgICByZXNwb25zZUhhbmRsZXIoZWx0LCByZXNwb25zZUluZm8pXG4gICAgICAgIGlmIChyZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgIT09IHRydWUpIHtcbiAgICAgICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAvLyBpZiB0aGUgYm9keSBubyBsb25nZXIgY29udGFpbnMgdGhlIGVsZW1lbnQsIHRyaWdnZXIgdGhlIGV2ZW50IG9uIHRoZSBjbG9zZXN0IHBhcmVudFxuICAgICAgICAvLyByZW1haW5pbmcgaW4gdGhlIERPTVxuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgbGV0IHNlY29uZGFyeVRyaWdnZXJFbHQgPSBudWxsXG4gICAgICAgICAgd2hpbGUgKGhpZXJhcmNoeS5sZW5ndGggPiAwICYmIHNlY29uZGFyeVRyaWdnZXJFbHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50RWx0SW5IaWVyYXJjaHkgPSBoaWVyYXJjaHkuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKGJvZHlDb250YWlucyhwYXJlbnRFbHRJbkhpZXJhcmNoeSkpIHtcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IHBhcmVudEVsdEluSGllcmFyY2h5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWNvbmRhcnlUcmlnZ2VyRWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14Om9uTG9hZEVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgdGhyb3cgZVxuICAgICAgfVxuICAgIH1cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRBYm9ydCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRpbWVvdXQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVJlcXVlc3QnLCByZXNwb25zZUluZm8pKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIHZhciBpbmRpY2F0b3JzID0gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KVxuICAgIHZhciBkaXNhYmxlRWx0cyA9IGRpc2FibGVFbGVtZW50cyhlbHQpXG5cbiAgICBmb3JFYWNoKFsnbG9hZHN0YXJ0JywgJ2xvYWRlbmQnLCAncHJvZ3Jlc3MnLCAnYWJvcnQnXSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBmb3JFYWNoKFt4aHIsIHhoci51cGxvYWRdLCBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnhocjonICsgZXZlbnROYW1lLCB7XG4gICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudC5sZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogZXZlbnQudG90YWxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVNlbmQnLCByZXNwb25zZUluZm8pXG4gICAgY29uc3QgcGFyYW1zID0gdXNlVXJsUGFyYW1zID8gbnVsbCA6IGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkRm9ybURhdGEpXG4gICAgeGhyLnNlbmQocGFyYW1zKVxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlVcGRhdGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3R5cGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFtwYXRoXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICogQHJldHVybiB7SHRteEhpc3RvcnlVcGRhdGV9XG4gICAqL1xuICBmdW5jdGlvbiBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBGaXJzdCBjb25zdWx0IHJlc3BvbnNlIGhlYWRlcnNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IHBhdGhGcm9tSGVhZGVycyA9IG51bGxcbiAgICBsZXQgdHlwZUZyb21IZWFkZXJzID0gbnVsbFxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaC1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVwbGFjZS1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlcGxhY2UtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdyZXBsYWNlJ1xuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIHdhcyBhIHJlc3BvbnNlIGhlYWRlciwgdGhhdCBoYXMgcHJpb3JpdHlcbiAgICBpZiAocGF0aEZyb21IZWFkZXJzKSB7XG4gICAgICBpZiAocGF0aEZyb21IZWFkZXJzID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0eXBlRnJvbUhlYWRlcnMsXG4gICAgICAgICAgcGF0aDogcGF0aEZyb21IZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTmV4dCByZXNvbHZlIHZpYSBET00gdmFsdWVzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmZpbmFsUmVxdWVzdFBhdGhcbiAgICBjb25zdCByZXNwb25zZVBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoXG5cbiAgICBjb25zdCBwdXNoVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXB1c2gtdXJsJylcbiAgICBjb25zdCByZXBsYWNlVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXJlcGxhY2UtdXJsJylcbiAgICBjb25zdCBlbGVtZW50SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHNhdmVUeXBlID0gbnVsbFxuICAgIGxldCBwYXRoID0gbnVsbFxuXG4gICAgaWYgKHB1c2hVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcHVzaFVybFxuICAgIH0gZWxzZSBpZiAocmVwbGFjZVVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncmVwbGFjZSdcbiAgICAgIHBhdGggPSByZXBsYWNlVXJsXG4gICAgfSBlbHNlIGlmIChlbGVtZW50SXNCb29zdGVkKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgIC8vIGZhbHNlIGluZGljYXRlcyBubyBwdXNoLCByZXR1cm4gZW1wdHkgb2JqZWN0XG4gICAgICBpZiAocGF0aCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgLy8gdHJ1ZSBpbmRpY2F0ZXMgd2Ugd2FudCB0byBmb2xsb3cgd2hlcmV2ZXIgdGhlIHNlcnZlciBlbmRlZCB1cCBzZW5kaW5nIHVzXG4gICAgICBpZiAocGF0aCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgICB9XG5cbiAgICAgIC8vIHJlc3RvcmUgYW55IGFuY2hvciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RcbiAgICAgIGlmIChyZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yICYmIHBhdGguaW5kZXhPZignIycpID09PSAtMSkge1xuICAgICAgICBwYXRoID0gcGF0aCArICcjJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogc2F2ZVR5cGUsXG4gICAgICAgIHBhdGhcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9IHJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0NvbmZpZywgc3RhdHVzKSB7XG4gICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVzcG9uc2VIYW5kbGluZ0NvbmZpZy5jb2RlKVxuICAgIHJldHVybiByZWdFeHAudGVzdChzdGF0dXMudG9TdHJpbmcoMTApKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ31cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnICovXG4gICAgICB2YXIgcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQgPSBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nW2ldXG4gICAgICBpZiAoY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQsIHhoci5zdGF0dXMpKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUhhbmRsaW5nRWxlbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBubyBtYXRjaGVzLCByZXR1cm4gbm8gc3dhcFxuICAgIHJldHVybiB7XG4gICAgICBzd2FwOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRpdGxlKHRpdGxlKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBjb25zdCB0aXRsZUVsdCA9IGZpbmQoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsdCkge1xuICAgICAgICB0aXRsZUVsdC5pbm5lckhUTUwgPSB0aXRsZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnRpdGxlID0gdGl0bGVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUFqYXhSZXNwb25zZShlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcbiAgICBsZXQgdGFyZ2V0ID0gcmVzcG9uc2VJbmZvLnRhcmdldFxuICAgIGNvbnN0IGV0YyA9IHJlc3BvbnNlSW5mby5ldGNcbiAgICBjb25zdCByZXNwb25zZUluZm9TZWxlY3QgPSByZXNwb25zZUluZm8uc2VsZWN0XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZU9uTG9hZCcsIHJlc3BvbnNlSW5mbykpIHJldHVyblxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyOi9pKSkge1xuICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyJywgZWx0KVxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtTG9jYXRpb246L2kpKSB7XG4gICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgbGV0IHJlZGlyZWN0UGF0aCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtTG9jYXRpb24nKVxuICAgICAgLyoqIEB0eXBlIHtIdG14QWpheEhlbHBlckNvbnRleHQme3BhdGg6c3RyaW5nfX0gKi9cbiAgICAgIHZhciByZWRpcmVjdFN3YXBTcGVjXG4gICAgICBpZiAocmVkaXJlY3RQYXRoLmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgICByZWRpcmVjdFN3YXBTcGVjID0gcGFyc2VKU09OKHJlZGlyZWN0UGF0aClcbiAgICAgICAgLy8gd2hhdCdzIHRoZSBiZXN0IHdheSB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdXNlciBkaWRuJ3QgaW5jbHVkZSB0aGlzXG4gICAgICAgIHJlZGlyZWN0UGF0aCA9IHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgICBkZWxldGUgcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICB9XG4gICAgICBhamF4SGVscGVyKCdnZXQnLCByZWRpcmVjdFBhdGgsIHJlZGlyZWN0U3dhcFNwZWMpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShyZWRpcmVjdFBhdGgpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUmVmcmVzaCA9IGhhc0hlYWRlcih4aHIsIC9IWC1SZWZyZXNoOi9pKSAmJiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZnJlc2gnKSA9PT0gJ3RydWUnXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlZGlyZWN0Oi9pKSkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24uaHJlZiA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVkaXJlY3QnKVxuICAgICAgc2hvdWxkUmVmcmVzaCAmJiBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlZnJlc2gpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGlzdG9yeVVwZGF0ZSA9IGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKVxuXG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGluZyA9IHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocilcbiAgICBjb25zdCBzaG91bGRTd2FwID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwXG4gICAgbGV0IGlzRXJyb3IgPSAhIXJlc3BvbnNlSGFuZGxpbmcuZXJyb3JcbiAgICBsZXQgaWdub3JlVGl0bGUgPSBodG14LmNvbmZpZy5pZ25vcmVUaXRsZSB8fCByZXNwb25zZUhhbmRsaW5nLmlnbm9yZVRpdGxlXG4gICAgbGV0IHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zZWxlY3RcbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy50YXJnZXQpIHtcbiAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSlcbiAgICB9XG4gICAgdmFyIHN3YXBPdmVycmlkZSA9IGV0Yy5zd2FwT3ZlcnJpZGVcbiAgICBpZiAoc3dhcE92ZXJyaWRlID09IG51bGwgJiYgcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGUpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlXG4gICAgfVxuXG4gICAgLy8gcmVzcG9uc2UgaGVhZGVycyBvdmVycmlkZSByZXNwb25zZSBoYW5kbGluZyBjb25maWdcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgIH1cblxuICAgIHZhciBzZXJ2ZXJSZXNwb25zZSA9IHhoci5yZXNwb25zZVxuICAgIC8qKiBAdHlwZSBIdG14QmVmb3JlU3dhcERldGFpbHMgKi9cbiAgICB2YXIgYmVmb3JlU3dhcERldGFpbHMgPSBtZXJnZU9iamVjdHMoe1xuICAgICAgc2hvdWxkU3dhcCxcbiAgICAgIHNlcnZlclJlc3BvbnNlLFxuICAgICAgaXNFcnJvcixcbiAgICAgIGlnbm9yZVRpdGxlLFxuICAgICAgc2VsZWN0T3ZlcnJpZGVcbiAgICB9LCByZXNwb25zZUluZm8pXG5cbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy5ldmVudCAmJiAhdHJpZ2dlckV2ZW50KHRhcmdldCwgcmVzcG9uc2VIYW5kbGluZy5ldmVudCwgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6YmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgc2VydmVyUmVzcG9uc2UgPSBiZWZvcmVTd2FwRGV0YWlscy5zZXJ2ZXJSZXNwb25zZSAvLyBhbGxvdyB1cGRhdGluZyBjb250ZW50XG4gICAgaXNFcnJvciA9IGJlZm9yZVN3YXBEZXRhaWxzLmlzRXJyb3IgLy8gYWxsb3cgdXBkYXRpbmcgZXJyb3JcbiAgICBpZ25vcmVUaXRsZSA9IGJlZm9yZVN3YXBEZXRhaWxzLmlnbm9yZVRpdGxlIC8vIGFsbG93IHVwZGF0aW5nIGlnbm9yaW5nIHRpdGxlXG4gICAgc2VsZWN0T3ZlcnJpZGUgPSBiZWZvcmVTd2FwRGV0YWlscy5zZWxlY3RPdmVycmlkZSAvLyBhbGxvdyB1cGRhdGluZyBzZWxlY3Qgb3ZlcnJpZGVcblxuICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSB0YXJnZXQgLy8gTWFrZSB1cGRhdGVkIHRhcmdldCBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLmZhaWxlZCA9IGlzRXJyb3IgLy8gTWFrZSBmYWlsZWQgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5zdWNjZXNzZnVsID0gIWlzRXJyb3IgLy8gTWFrZSBzdWNjZXNzZnVsIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcblxuICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjg2KSB7XG4gICAgICAgIGNhbmNlbFBvbGxpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IGV4dGVuc2lvbi50cmFuc2Zvcm1SZXNwb25zZShzZXJ2ZXJSZXNwb25zZSwgeGhyLCBlbHQpXG4gICAgICB9KVxuXG4gICAgICAvLyBTYXZlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSB3aWxsIGJlIGEgaGlzdG9yeSB1cGRhdGVcbiAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICAgIH1cbiAgICAgIHZhciBzd2FwU3BlYyA9IGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcE92ZXJyaWRlKVxuXG4gICAgICBpZiAoIXN3YXBTcGVjLmhhc093blByb3BlcnR5KCdpZ25vcmVUaXRsZScpKSB7XG4gICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gaWdub3JlVGl0bGVcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcblxuICAgICAgLy8gb3B0aW9uYWwgdHJhbnNpdGlvbiBBUEkgcHJvbWlzZSBjYWxsYmFja3NcbiAgICAgIGxldCBzZXR0bGVSZXNvbHZlID0gbnVsbFxuICAgICAgbGV0IHNldHRsZVJlamVjdCA9IG51bGxcblxuICAgICAgaWYgKHJlc3BvbnNlSW5mb1NlbGVjdCkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSW5mb1NlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc2VsZWN0Oi9pKSkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzZWxlY3QnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3RPT0IgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0LW9vYicpXG4gICAgICBjb25zdCBzZWxlY3QgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0JylcblxuICAgICAgbGV0IGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGlmIHdlIG5lZWQgdG8gc2F2ZSBoaXN0b3J5LCBkbyBzbywgYmVmb3JlIHN3YXBwaW5nIHNvIHRoYXQgcmVsYXRpdmUgcmVzb3VyY2VzIGhhdmUgdGhlIGNvcnJlY3QgYmFzZSBVUkxcbiAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5VXBkYXRlJywgbWVyZ2VPYmplY3RzKHsgaGlzdG9yeTogaGlzdG9yeVVwZGF0ZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnB1c2hlZEludG9IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VVcmxJbkhpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpyZXBsYWNlZEluSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dhcCh0YXJnZXQsIHNlcnZlclJlc3BvbnNlLCBzd2FwU3BlYywge1xuICAgICAgICAgICAgc2VsZWN0OiBzZWxlY3RPdmVycmlkZSB8fCBzZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3RPT0IsXG4gICAgICAgICAgICBldmVudEluZm86IHJlc3BvbnNlSW5mbyxcbiAgICAgICAgICAgIGFuY2hvcjogcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvcixcbiAgICAgICAgICAgIGNvbnRleHRFbGVtZW50OiBlbHQsXG4gICAgICAgICAgICBhZnRlclN3YXBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1Td2FwOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1Td2FwJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlclNldHRsZUNhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVNldHRsZTovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlc29sdmUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3dhcEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZWplY3QpXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBzaG91bGRUcmFuc2l0aW9uID0gaHRteC5jb25maWcuZ2xvYmFsVmlld1RyYW5zaXRpb25zXG4gICAgICBpZiAoc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ3RyYW5zaXRpb24nKSkge1xuICAgICAgICBzaG91bGRUcmFuc2l0aW9uID0gc3dhcFNwZWMudHJhbnNpdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVUcmFuc2l0aW9uJywgcmVzcG9uc2VJbmZvKSAmJlxuICAgICAgICAgICAgICB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBjb25zdCBzZXR0bGVQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgICBzZXR0bGVSZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgICBzZXR0bGVSZWplY3QgPSBfcmVqZWN0XG4gICAgICAgIH0pXG4gICAgICAgIC8vIHdyYXAgdGhlIG9yaWdpbmFsIGRvU3dhcCgpIGluIGEgY2FsbCB0byBzdGFydFZpZXdUcmFuc2l0aW9uKClcbiAgICAgICAgY29uc3QgaW5uZXJEb1N3YXAgPSBkb1N3YXBcbiAgICAgICAgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5uZXJEb1N3YXAoKVxuICAgICAgICAgICAgcmV0dXJuIHNldHRsZVByb21pc2VcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzd2FwU3BlYy5zd2FwRGVsYXkgPiAwKSB7XG4gICAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9Td2FwLCBzd2FwU3BlYy5zd2FwRGVsYXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1N3YXAoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNFcnJvcikge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpyZXNwb25zZUVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6ICdSZXNwb25zZSBTdGF0dXMgRXJyb3IgQ29kZSAnICsgeGhyLnN0YXR1cyArICcgZnJvbSAnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlcXVlc3RQYXRoIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXh0ZW5zaW9ucyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIEh0bXhFeHRlbnNpb24+fSAqL1xuICBjb25zdCBleHRlbnNpb25zID0ge31cblxuICAvKipcbiAgICogZXh0ZW5zaW9uQmFzZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYWxsIGV4dGVuc2lvbnMuXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZXh0ZW5zaW9uQmFzZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5pdDogZnVuY3Rpb24oYXBpKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgb25FdmVudDogZnVuY3Rpb24obmFtZSwgZXZ0KSB7IHJldHVybiB0cnVlIH0sXG4gICAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24odGV4dCwgeGhyLCBlbHQpIHsgcmV0dXJuIHRleHQgfSxcbiAgICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgaGFuZGxlU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24oeGhyLCBwYXJhbWV0ZXJzLCBlbHQpIHsgcmV0dXJuIG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZWZpbmVFeHRlbnNpb24gaW5pdGlhbGl6ZXMgdGhlIGV4dGVuc2lvbiBhbmQgYWRkcyBpdCB0byB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNkZWZpbmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbn0gZXh0ZW5zaW9uIHRoZSBleHRlbnNpb24gZGVmaW5pdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gZGVmaW5lRXh0ZW5zaW9uKG5hbWUsIGV4dGVuc2lvbikge1xuICAgIGlmIChleHRlbnNpb24uaW5pdCkge1xuICAgICAgZXh0ZW5zaW9uLmluaXQoaW50ZXJuYWxBUEkpXG4gICAgfVxuICAgIGV4dGVuc2lvbnNbbmFtZV0gPSBtZXJnZU9iamVjdHMoZXh0ZW5zaW9uQmFzZSgpLCBleHRlbnNpb24pXG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlRXh0ZW5zaW9uIHJlbW92ZXMgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFeHRlbnNpb24obmFtZSkge1xuICAgIGRlbGV0ZSBleHRlbnNpb25zW25hbWVdXG4gIH1cblxuICAvKipcbiAgICogZ2V0RXh0ZW5zaW9ucyBzZWFyY2hlcyB1cCB0aGUgRE9NIHRyZWUgdG8gcmV0dXJuIGFsbCBleHRlbnNpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbltdPX0gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nW109fSBleHRlbnNpb25zVG9JZ25vcmVcbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEV4dGVuc2lvbnMoZWx0LCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSkge1xuICAgIGlmIChleHRlbnNpb25zVG9SZXR1cm4gPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9SZXR1cm4gPSBbXVxuICAgIH1cbiAgICBpZiAoZWx0ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbnNUb1JldHVyblxuICAgIH1cbiAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlID0gW11cbiAgICB9XG4gICAgY29uc3QgZXh0ZW5zaW9uc0ZvckVsZW1lbnQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1leHQnKVxuICAgIGlmIChleHRlbnNpb25zRm9yRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChleHRlbnNpb25zRm9yRWxlbWVudC5zcGxpdCgnLCcpLCBmdW5jdGlvbihleHRlbnNpb25OYW1lKSB7XG4gICAgICAgIGV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb25OYW1lLnJlcGxhY2UoLyAvZywgJycpXG4gICAgICAgIGlmIChleHRlbnNpb25OYW1lLnNsaWNlKDAsIDcpID09ICdpZ25vcmU6Jykge1xuICAgICAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZS5wdXNoKGV4dGVuc2lvbk5hbWUuc2xpY2UoNykpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZS5pbmRleE9mKGV4dGVuc2lvbk5hbWUpIDwgMCkge1xuICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uTmFtZV1cbiAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmIGV4dGVuc2lvbnNUb1JldHVybi5pbmRleE9mKGV4dGVuc2lvbikgPCAwKSB7XG4gICAgICAgICAgICBleHRlbnNpb25zVG9SZXR1cm4ucHVzaChleHRlbnNpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEluaXRpYWxpemF0aW9uXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpc1JlYWR5ID0gZmFsc2VcbiAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgaXNSZWFkeSA9IHRydWVcbiAgfSlcblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIG5vdyBpZiBET01Db250ZW50TG9hZGVkIGhhcyBmaXJlZCwgb3RoZXJ3aXNlIGxpc3RlbiBmb3IgaXQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdXNlcyBpc1JlYWR5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGFzayB0aGUgYnJvd3NlciB3aGV0aGVyXG4gICAqIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gZmlyZWQ7IHRoZXJlJ3MgYSBnYXAgYmV0d2VlbiBET01Db250ZW50TG9hZGVkXG4gICAqIGZpcmluZyBhbmQgcmVhZHlzdGF0ZT1jb21wbGV0ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWR5KGZuKSB7XG4gICAgLy8gQ2hlY2tpbmcgcmVhZHlTdGF0ZSBoZXJlIGlzIGEgZmFpbHNhZmUgaW4gY2FzZSB0aGUgaHRteCBzY3JpcHQgdGFnIGVudGVyZWQgdGhlIERPTSBieVxuICAgIC8vIHNvbWUgbWVhbnMgb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQuXG4gICAgaWYgKGlzUmVhZHkgfHwgZ2V0RG9jdW1lbnQoKS5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICBmbigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydEluZGljYXRvclN0eWxlcygpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaW5jbHVkZUluZGljYXRvclN0eWxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG5vbmNlQXR0cmlidXRlID0gaHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZSA/IGAgbm9uY2U9XCIke2h0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2V9XCJgIDogJydcbiAgICAgIGdldERvY3VtZW50KCkuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsXG4gICAgICAgICc8c3R5bGUnICsgbm9uY2VBdHRyaWJ1dGUgKyAnPlxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjB9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJyAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJy4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgPC9zdHlsZT4nKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1ldGFDb25maWcoKSB7XG4gICAgLyoqIEB0eXBlIEhUTUxNZXRhRWxlbWVudCAqL1xuICAgIGNvbnN0IGVsZW1lbnQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImh0bXgtY29uZmlnXCJdJylcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHBhcnNlSlNPTihlbGVtZW50LmNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VNZXRhQ29uZmlnKCkge1xuICAgIGNvbnN0IG1ldGFDb25maWcgPSBnZXRNZXRhQ29uZmlnKClcbiAgICBpZiAobWV0YUNvbmZpZykge1xuICAgICAgaHRteC5jb25maWcgPSBtZXJnZU9iamVjdHMoaHRteC5jb25maWcsIG1ldGFDb25maWcpXG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnRcbiAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgbWVyZ2VNZXRhQ29uZmlnKClcbiAgICBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKVxuICAgIGxldCBib2R5ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgcHJvY2Vzc05vZGUoYm9keSlcbiAgICBjb25zdCByZXN0b3JlZEVsdHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIltoeC10cmlnZ2VyPSdyZXN0b3JlZCddLFtkYXRhLWh4LXRyaWdnZXI9J3Jlc3RvcmVkJ11cIlxuICAgIClcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWJvcnQnLCBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXRcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YSh0YXJnZXQpXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhICYmIGludGVybmFsRGF0YS54aHIpIHtcbiAgICAgICAgaW50ZXJuYWxEYXRhLnhoci5hYm9ydCgpXG4gICAgICB9XG4gICAgfSlcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIGNvbnN0IG9yaWdpbmFsUG9wc3RhdGUgPSB3aW5kb3cub25wb3BzdGF0ZSA/IHdpbmRvdy5vbnBvcHN0YXRlLmJpbmQod2luZG93KSA6IG51bGxcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5zdGF0ZSAmJiBldmVudC5zdGF0ZS5odG14KSB7XG4gICAgICAgIHJlc3RvcmVIaXN0b3J5KClcbiAgICAgICAgZm9yRWFjaChyZXN0b3JlZEVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnJlc3RvcmVkJywge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGdldERvY3VtZW50KCksXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsUG9wc3RhdGUpIHtcbiAgICAgICAgICBvcmlnaW5hbFBvcHN0YXRlKGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoYm9keSwgJ2h0bXg6bG9hZCcsIHt9KSAvLyBnaXZlIHJlYWR5IGhhbmRsZXJzIGEgY2hhbmNlIHRvIGxvYWQgdXAgYmVmb3JlIGZpcmluZyB0aGlzIGV2ZW50XG4gICAgICBib2R5ID0gbnVsbCAvLyBraWxsIHJlZmVyZW5jZSBmb3IgZ2NcbiAgICB9LCAwKVxuICB9KVxuXG4gIHJldHVybiBodG14XG59KSgpXG5cbi8qKiBAdHlwZWRlZiB7J2dldCd8J2hlYWQnfCdwb3N0J3wncHV0J3wnZGVsZXRlJ3wnY29ubmVjdCd8J29wdGlvbnMnfCd0cmFjZSd8J3BhdGNoJ30gSHR0cFZlcmIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2FwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdE9PQl1cbiAqIEBwcm9wZXJ0eSB7Kn0gW2V2ZW50SW5mb11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYW5jaG9yXVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbY29udGV4dEVsZW1lbnRdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU3dhcENhbGxiYWNrXVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclNldHRsZUNhbGxiYWNrXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHN3YXBDYWxsYmFja1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeydpbm5lckhUTUwnIHwgJ291dGVySFRNTCcgfCAnYmVmb3JlYmVnaW4nIHwgJ2FmdGVyYmVnaW4nIHwgJ2JlZm9yZWVuZCcgfCAnYWZ0ZXJlbmQnIHwgJ2RlbGV0ZScgfCAnbm9uZScgfCBzdHJpbmd9IEh0bXhTd2FwU3R5bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEh0bXhTd2FwU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzd2FwRGVsYXlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZXR0bGVEZWxheVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJhbnNpdGlvbl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoZWFkXVxuICogQHByb3BlcnR5IHsndG9wJyB8ICdib3R0b20nfSBbc2Nyb2xsXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JvbGxUYXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3ddXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3dUYXJnZXRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb2N1c1Njcm9sbF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKHRoaXM6Tm9kZSwgZXZ0OkV2ZW50KSA9PiBib29sZWFuKSAmIHtzb3VyY2U6IHN0cmluZ319IENvbmRpdGlvbmFsRnVuY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9sbEludGVydmFsXVxuICogQHByb3BlcnR5IHtDb25kaXRpb25hbEZ1bmN0aW9ufSBbZXZlbnRGaWx0ZXJdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjaGFuZ2VkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbb25jZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnN1bWVdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmcm9tXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Rocm90dGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9vdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyZXNob2xkXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tlbHQ6IEVsZW1lbnQsIG1lc3NhZ2U6IHN0cmluZywgdmFsaWRpdHk6IFZhbGlkaXR5U3RhdGV9fSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gSFgtUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlclxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlci1OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UYXJnZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIWC1DdXJyZW50LVVSTFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtIWC1Qcm9tcHRdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUJvb3N0ZWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0NvbnRlbnQtVHlwZV1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3RdXG4gKi9cblxuLyoqIEB0eXBlZGVmIEh0bXhBamF4SGVscGVyQ29udGV4dFxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3NvdXJjZV1cbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IFtldmVudF1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlVXJsUGFyYW1zXG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHBhcmFtZXRlcnMgZm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IHVuZmlsdGVyZWRGb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHVuZmlsdGVyZWRQYXJhbWV0ZXJzIHVuZmlsdGVyZWRGb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn0gaGVhZGVyc1xuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEBwcm9wZXJ0eSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpdGhDcmVkZW50aWFsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoXG4gKiBAcHJvcGVydHkge0V2ZW50fSB0cmlnZ2VyaW5nRXZlbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUluZm9cbiAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhFdGN9IGV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VsZWN0XG4gKiBAcHJvcGVydHkge3tyZXF1ZXN0UGF0aDogc3RyaW5nLCBmaW5hbFJlcXVlc3RQYXRoOiBzdHJpbmcsIHJlc3BvbnNlUGF0aDogc3RyaW5nfG51bGwsIGFuY2hvcjogc3RyaW5nfX0gcGF0aEluZm9cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N1Y2Nlc3NmdWxdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtrZWVwSW5kaWNhdG9yc11cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhBamF4RXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXR1cm5Qcm9taXNlXVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFt0YXJnZXRPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2RlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBzd2FwXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlcnJvcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtldmVudF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIdG14UmVzcG9uc2VJbmZvICYge3Nob3VsZFN3YXA6IGJvb2xlYW4sIHNlcnZlclJlc3BvbnNlOiBhbnksIGlzRXJyb3I6IGJvb2xlYW4sIGlnbm9yZVRpdGxlOiBib29sZWFuLCBzZWxlY3RPdmVycmlkZTpzdHJpbmd9fSBIdG14QmVmb3JlU3dhcERldGFpbHNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBIdG14QWpheEhhbmRsZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygoKSA9PiB2b2lkKX0gSHRteFNldHRsZVRhc2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhTZXR0bGVJbmZvXG4gKiBAcHJvcGVydHkge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gZWx0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aXRsZV1cbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgtZXh0ZW5zaW9ucy9ibG9iL21haW4vUkVBRE1FLm1kXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14RXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkgeyhhcGk6IGFueSkgPT4gdm9pZH0gaW5pdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnR8Q3VzdG9tRXZlbnQpID0+IGJvb2xlYW59IG9uRXZlbnRcbiAqIEBwcm9wZXJ0eSB7KHRleHQ6IHN0cmluZywgeGhyOiBYTUxIdHRwUmVxdWVzdCwgZWx0OiBFbGVtZW50KSA9PiBzdHJpbmd9IHRyYW5zZm9ybVJlc3BvbnNlXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpID0+IGJvb2xlYW59IGlzSW5saW5lU3dhcFxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLCB0YXJnZXQ6IE5vZGUsIGZyYWdtZW50OiBOb2RlLCBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbykgPT4gYm9vbGVhbnxOb2RlW119IGhhbmRsZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHhocjogWE1MSHR0cFJlcXVlc3QsIHBhcmFtZXRlcnM6IEZvcm1EYXRhLCBlbHQ6IE5vZGUpID0+ICp8c3RyaW5nfG51bGx9IGVuY29kZVBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nW118bnVsbH0gZ2V0U2VsZWN0b3JzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGh0bXhcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBkZXBlbmRzT24ocGF0aFNwZWM6IGFueSwgdXJsOiBzdHJpbmcpIHtcbiAgaWYgKHBhdGhTcGVjID09PSBcImlnbm9yZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGRlcGVuZGVuY3lQYXRoID0gcGF0aFNwZWMuc3BsaXQoXCIvXCIpO1xuICBjb25zdCB1cmxQYXRoID0gdXJsLnNwbGl0KFwiL1wiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeUVsZW1lbnQgPSBkZXBlbmRlbmN5UGF0aC5zaGlmdCgpO1xuICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gdXJsUGF0aFtpXTtcbiAgICBpZiAoZGVwZW5kZW5jeUVsZW1lbnQgIT09IHBhdGhFbGVtZW50ICYmIGRlcGVuZGVuY3lFbGVtZW50ICE9PSBcIipcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDAgfHxcbiAgICAgIChkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDEgJiYgZGVwZW5kZW5jeVBhdGhbMF0gPT09IFwiXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgZWx0c1dpdGhEZXBzID0gaHRteC5maW5kQWxsKFwiW3BhdGgtZGVwc11cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0c1dpdGhEZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZWx0ID0gZWx0c1dpdGhEZXBzW2ldO1xuICAgIGlmIChkZXBlbmRzT24oZWx0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSwgcGF0aCkpIHtcbiAgICAgIGh0bXgudHJpZ2dlcihlbHQsIFwicGF0aC1kZXBzXCIsIG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInBhdGgtZGVwc1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmJlZm9yZU9uTG9hZFwiKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBldnQuZGV0YWlsLnJlcXVlc3RDb25maWc7XG4gICAgICAvLyBtdXRhdGluZyBjYWxsXG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZyAmJlxuICAgICAgICBjb25maWcudmVyYiAhPT0gXCJnZXRcIiAmJlxuICAgICAgICBldnQudGFyZ2V0ICE9IG51bGwgJiZcbiAgICAgICAgZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgZXZ0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIikgIT09IFwiaWdub3JlXCJcbiAgICAgICkge1xuICAgICAgICByZWZyZXNoUGF0aChjb25maWcucGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCwge0h0bXhTZXR0bGVJbmZvLCBIdG14U3dhcFN0eWxlfSBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbn1cblxuY29uc3QgaWdub3JlZEV2ZW50cyA9IFsnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCAnaHRteDpiZWZvcmVTd2FwJywgJ2h0bXg6YWZ0ZXJTd2FwJywgJ2h0bXg6YmVmb3JlT25Mb2FkJywgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCAnaHRteDpjb25maWdSZXF1ZXN0JywgJ2h0bXg6Y29uZmlnUmVzcG9uc2UnLCAnaHRteDpyZXNwb25zZUVycm9yJ107XG5cbmZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWU6IHN0cmluZywgZGV0YWlsOiBhbnkpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG59XG5cbmZ1bmN0aW9uIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQ6IEhUTUxFbGVtZW50LCBuYW1lOiBzdHJpbmcsIGV2ZW50OiBDdXN0b21FdmVudCwgdHJpZ2dlcmVkOiBTZXQ8SFRNTEVsZW1lbnQ+KSB7XG4gICAgaWYoaWdub3JlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY2hpbGRyZW4pIHtcbiAgICAgICAgQXJyYXkuZnJvbSh0YXJnZXQuY2hpbGRyZW4pLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtlaGFiID0ga2ViYWJFdmVudE5hbWUobmFtZSk7XG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBrZWhhYi5yZXBsYWNlKFwiaHRteDpcIiwgXCJoeC1vbjo6XCIpXG4gICAgICAgICAgICBpZiAoIXRyaWdnZXJlZC5oYXMoZSBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBpZihlLmhhc0F0dHJpYnV0ZShldmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZS5yZXBsYWNlKFwiaHgtb246OlwiLCBcImh0bXg6XCIpLCBldmVudC5kZXRhaWwpXG4gICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmRldGFpbC5tZXRhID0gJ3RyaWdnZXItY2hpbGRyZW4nXG4gICAgICAgICAgICAgICAgICAgIGUuZGlzcGF0Y2hFdmVudChuZXdFdmVudClcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkLmFkZChlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoaWxkcmVuKGUgYXMgSFRNTEVsZW1lbnQsIG5hbWUsIGV2ZW50LCB0cmlnZ2VyZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwidHJpZ2dlci1jaGlsZHJlblwiLCB7XG4gICAgb25FdmVudDogKG5hbWUsIGV2dDogRXZlbnQgfCBDdXN0b21FdmVudCkgPT4ge1xuICAgICAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZihldnQuZGV0YWlsLm1ldGEgPT09ICd0cmlnZ2VyLWNoaWxkcmVuJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyaWdnZXJlZCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfHwgZXZ0LmRldGFpbC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQsIG5hbWUsIGV2dCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpOiBhbnkpOiB2b2lkIHtcbiAgICB9LFxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbiAoXG4gICAgICAgIHRleHQ6IHN0cmluZyxcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgZWx0OiBFbGVtZW50LFxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH0sXG4gICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbiAoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uIChcbiAgICAgICAgc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLFxuICAgICAgICB0YXJnZXQ6IE5vZGUsXG4gICAgICAgIGZyYWdtZW50OiBOb2RlLFxuICAgICAgICBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbyxcbiAgICApOiBib29sZWFuIHwgTm9kZVtdIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24gKFxuICAgICAgICB4aHI6IFhNTEh0dHBSZXF1ZXN0LFxuICAgICAgICBwYXJhbWV0ZXJzOiBGb3JtRGF0YSxcbiAgICAgICAgZWx0OiBOb2RlLFxuICAgICkge1xuICAgIH0sXG4gICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbiAoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiZGVidWdcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoY29uc29sZS5kZWJ1Zykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhuYW1lLCBldnQpO1xuICAgIH0gZWxzZSBpZiAoY29uc29sZSkge1xuICAgICAgY29uc29sZS5sb2coXCJERUJVRzpcIiwgbmFtZSwgZXZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm9vcFxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5jb25zdCBjb25maWc6IGFueSA9IGh0bXguY29uZmlnO1xuXG4vKiogQHR5cGUge2ltcG9ydChcIi4uL2h0bXhcIikuSHRteEludGVybmFsQXBpfSAqL1xubGV0IGFwaTogYW55O1xuXG5jb25zdCBhdHRyUHJlZml4ID0gXCJoeC10YXJnZXQtXCI7XG5cbi8vIElFMTEgZG9lc24ndCBzdXBwb3J0IHN0cmluZy5zdGFydHNXaXRoXG5mdW5jdGlvbiBzdGFydHNXaXRoKHN0cjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZykge1xuICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHJlc3BDb2RlTnVtYmVyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfVxuICovXG5mdW5jdGlvbiBnZXRSZXNwQ29kZVRhcmdldChlbHQ6IEVsZW1lbnQsIHJlc3BDb2RlTnVtYmVyOiBudW1iZXIpIHtcbiAgaWYgKCFlbHQgfHwgIXJlc3BDb2RlTnVtYmVyKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCByZXNwQ29kZSA9IHJlc3BDb2RlTnVtYmVyLnRvU3RyaW5nKCk7XG5cbiAgLy8gJyonIGlzIHRoZSBvcmlnaW5hbCBzeW50YXgsIGFzIHRoZSBvYnZpb3VzIGNoYXJhY3RlciBmb3IgYSB3aWxkY2FyZC5cbiAgLy8gVGhlICd4JyBhbHRlcm5hdGl2ZSB3YXMgYWRkZWQgZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIEhUTUxcbiAgLy8gdGVtcGxhdGluZyBlbmdpbmVzLCBkdWUgdG8gYW1iaWd1aXR5IGFyb3VuZCB3aGljaCBjaGFyYWN0ZXJzIGFyZVxuICAvLyBzdXBwb3J0ZWQgaW4gSFRNTCBhdHRyaWJ1dGVzLlxuICAvL1xuICAvLyBTdGFydCB3aXRoIHRoZSBtb3N0IHNwZWNpZmljIHBvc3NpYmxlIGF0dHJpYnV0ZSBhbmQgZ2VuZXJhbGl6ZSBmcm9tXG4gIC8vIHRoZXJlLlxuICBjb25zdCBhdHRyUG9zc2liaWxpdGllcyA9IFtcbiAgICByZXNwQ29kZSxcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwieFwiLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4XCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieHhcIixcblxuICAgIFwiKlwiLFxuICAgIFwieFwiLFxuICAgIFwiKioqXCIsXG4gICAgXCJ4eHhcIixcbiAgXTtcbiAgaWYgKHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNFwiKSB8fCBzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjVcIikpIHtcbiAgICBhdHRyUG9zc2liaWxpdGllcy5wdXNoKFwiZXJyb3JcIik7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJQb3NzaWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXR0ciA9IGF0dHJQcmVmaXggKyBhdHRyUG9zc2liaWxpdGllc1tpXTtcbiAgICBjb25zdCBhdHRyVmFsdWUgPSBhcGkuZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cik7XG4gICAgaWYgKGF0dHJWYWx1ZSkge1xuICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gXCJ0aGlzXCIpIHtcbiAgICAgICAgcmV0dXJuIGFwaS5maW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhcGkucXVlcnlTZWxlY3RvckV4dChlbHQsIGF0dHJWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBAcGFyYW0ge0V2ZW50fSBldnQgKi9cbmZ1bmN0aW9uIGhhbmRsZUVycm9yRmxhZyhldnQ6IEN1c3RvbUV2ZW50KSB7XG4gIGlmIChldnQuZGV0YWlsLmlzRXJyb3IpIHtcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IpIHtcbiAgICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IpIHtcbiAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSB0cnVlO1xuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicmVzcG9uc2UtdGFyZ2V0c1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaW5pdDogKGFwaVJlZikgPT4ge1xuICAgIGFwaSA9IGFwaVJlZjtcblxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5hbWUgPT09IFwiaHRteDpiZWZvcmVTd2FwXCIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyICYmXG4gICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMgIT09IDIwMFxuICAgICkge1xuICAgICAgaWYgKGV2dC5kZXRhaWwudGFyZ2V0KSB7XG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcpIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgJiZcbiAgICAgICAgICBldnQuZGV0YWlsLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5tYXRjaCgvSFgtUmV0YXJnZXQ6L2kpXG4gICAgICAgICkge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0UmVzcENvZGVUYXJnZXQoXG4gICAgICAgIGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZy5lbHQsXG4gICAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyxcbiAgICAgICk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICBldnQuZGV0YWlsLnRhcmdldCA9IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibXV0YXRpb24tZXJyb3JcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDphZnRlclJlcXVlc3RcIikge1xuICAgICAgaWYgKCFldnQuZGV0YWlsIHx8ICFldnQuZGV0YWlsLnhocikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0dXMgPSBldnQuZGV0YWlsLnhoci5zdGF0dXM7XG4gICAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICBodG14LmZpbmRBbGwoXCJbaHgtb25cXFxcOlxcXFw6bXV0YXRpb24tZXJyb3JdXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgXCJodG14Om11dGF0aW9uLWVycm9yXCIsIHsgc3RhdHVzIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IHtjcmVhdGVXZWJTb2NrZXRDbGllbnR9IGZyb20gXCIuLi91dGlsL3dzXCI7XG5cbmxldCBsYXN0VmVyc2lvbiA9IFwiXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibGl2ZXJlbG9hZFwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBlbmFibGVkID0gZmFsc2VcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIEFycmF5LmZyb20oaHRteC5maW5kQWxsKFwiW2h4LWV4dF1cIikpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtZXh0XCIpO1xuICAgICAgICAgICAgaWYodmFsdWU/LnNwbGl0KFwiIFwiKS5pbmNsdWRlcyhcImxpdmVyZWxvYWRcIikpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ2xpdmVyZWxvYWQgZXh0ZW5zaW9uIGluaXRpYWxpemVkLicpO1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRXZlbnRTb3VyY2Ugb2JqZWN0IGFuZCBwb2ludCBpdCB0byB5b3VyIFNTRSBlbmRwb2ludFxuICAgICAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2Rldi9saXZlcmVsb2FkJyk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YVxuICAgICAgICAgICAgLy8gTG9nIHRoZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uICE9PSBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgIHJlbG9hZCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgKGUuZy4sIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkKVxuICAgICAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50U291cmNlIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgfTtcblxuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcblxuICAgIH0sXG59KTtcblxuZnVuY3Rpb24gcmVsb2FkKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxufSIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5jb25zdCBldmFsRnVuY1JlZ2V4ID0vX19ldmFsX1tBLVphLXowLTldK1xcKFthLXpdK1xcKS9nbVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImh0bWdvXCIsIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgIGlmKG5hbWUgPT09IFwiaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcblxubGV0IGFwaSA6IGFueSA9IG51bGw7XG5sZXQgcHJvY2Vzc2VkID0gbmV3IFNldDxzdHJpbmc+KClcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJzc2VcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGlSZWYpIHtcbiAgICAgICAgYXBpID0gYXBpUmVmO1xuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldDtcbiAgICAgICAgaWYoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tzc2UtY29ubmVjdF0nKTtcbiAgICAgICAgICAgIGZvciAobGV0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNzZS1jb25uZWN0XCIpITtcbiAgICAgICAgICAgICAgICBpZih1cmwgJiYgIXByb2Nlc3NlZC5oYXModXJsKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0RXZlbnRTb3VyY2UoZWxlbWVudCwgdXJsKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQuYWRkKHVybClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KVxuXG5mdW5jdGlvbiBjb25uZWN0RXZlbnRTb3VyY2UoZWxlOiBFbGVtZW50LCB1cmw6IHN0cmluZykge1xuICAgIGlmKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbygnQ29ubmVjdGluZyB0byBFdmVudFNvdXJjZScsIHVybClcbiAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0V2ZW50U291cmNlIG9wZW46JywgZXZlbnQpO1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlT3BlblwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VFcnJvclwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09IEV2ZW50U291cmNlLkNMT1NFRCkge1xuICAgICAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdFdmVudFNvdXJjZSBtZXNzYWdlOicsIGV2ZW50LmRhdGEpO1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHt0YXNrczogW119KTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG5mdW5jdGlvbiB3YXRjaFVybChjYWxsYmFjazogKG9sZFVybDogc3RyaW5nLCBuZXdVcmw6IHN0cmluZykgPT4gdm9pZCkge1xuICBsZXQgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBsYXN0VXJsKSB7XG4gICAgICBjYWxsYmFjayhsYXN0VXJsLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuICB9LCAxMDApO1xufVxuXG53YXRjaFVybCgoXywgbmV3VXJsKSA9PiB7XG4gIG9uVXJsQ2hhbmdlKG5ld1VybCk7XG59KTtcblxuZnVuY3Rpb24gb25VcmxDaGFuZ2UobmV3VXJsOiBzdHJpbmcpIHtcbiAgbGV0IHVybCA9IG5ldyBVUkwobmV3VXJsKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXJdXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtdHJpZ2dlclwiKTtcbiAgICBpZiAoIXRyaWdnZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gdHJpZ2dlcnMuc3BsaXQoXCIsIFwiKTtcbiAgICBpZiAoc3BsaXQuZmluZCgocykgPT4gcyA9PT0gXCJ1cmxcIikpIHtcbiAgICAgIGh0bXguc3dhcChlbGVtZW50LCBcInVybFwiLCB7XG4gICAgICAgIHN3YXBTdHlsZTogXCJvdXRlckhUTUxcIixcbiAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZXNdIG9mIHVybC5zZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgbGV0IGV2ZW50TmFtZSA9IFwicXM6XCIgKyBrZXk7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5pbmNsdWRlcyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0cmlnZ2VyaW5nXCIsIGV2ZW50TmFtZSk7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIGV2ZW50TmFtZSwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtbWF0Y2gtcXBdXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBlbC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIikpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5yZXBsYWNlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiwgXCJcIik7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KG1hdGNoKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgaHRteC5zd2FwKGVsLCBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgPz8gXCJcIiwge1xuICAgICAgICAgICAgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLFxuICAgICAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGFzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzTWF0Y2gpIHtcbiAgICAgIGxldCBkZWZhdWx0S2V5ID0gZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtZGVmYXVsdFwiKTtcbiAgICAgIGlmIChkZWZhdWx0S2V5KSB7XG4gICAgICAgIGh0bXguc3dhcChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiICsgZGVmYXVsdEtleSkgPz8gXCJcIixcbiAgICAgICAgICB7IHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIiwgc3dhcERlbGF5OiAwLCBzZXR0bGVEZWxheTogMCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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Q0FBQUEsQ0FBUzJCLEVBQVcsSUFBSSxDQUFBLENBQ3JDLEtBQ0YsQ0FDRixDQUVKLENBQUMsQ0FFRCxDQUFBLFFBQUEsQ0FBUyxpQkFBaUIsZUFBZSxDQUFBLENBQUUsUUFBU2hHLENBQU8sRUFBQSxDQUN6RCxJQUFJcVYsQ0FBVyxDQUFBLENBQUEsQ0FBQSxDQUNmLFFBQVNyWCxDQUFRZ0MsSUFBQUEsQ0FBQUEsQ0FBRyxtQkFDbEIsQ0FBQSxHQUFJaEMsRUFBSyxVQUFXLENBQUEsc0JBQXNCLEVBQUcsQ0FDM0MsSUFBSWMsRUFBUWQsQ0FBSyxDQUFBLE9BQUEsQ0FBUSx1QkFBd0IsRUFBRSxDQUFBLENBRW5ELEdBRFk2QyxDQUFJLENBQUEsWUFBQSxDQUFhLElBQUkvQixDQUFLLENBQUEsQ0FDM0IsQ0FDVDhULENBQUssQ0FBQSxJQUFBLENBQUs1UyxDQUFJQSxDQUFBQSxDQUFBQSxDQUFHLFlBQWFoQyxDQUFBQSxDQUFJLEdBQUssRUFBSSxDQUFBLENBQ3pDLFVBQVcsV0FDWCxDQUFBLFNBQUEsQ0FBVyxFQUNYLFdBQWEsQ0FBQSxDQUNmLENBQUMsQ0FDRHFYLENBQUFBLENBQUFBLENBQVcsR0FDWCxLQUNGLENBQ0YsQ0FFRixHQUFJLENBQUNBLEVBQVUsQ0FDYixJQUFJQyxFQUFhdFYsQ0FBRyxDQUFBLFlBQUEsQ0FBYSxxQkFBcUIsQ0FDbERzVixDQUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXgsIHtIdG14U2V0dGxlSW5mbywgSHRteFN3YXBTdHlsZX0gZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwgZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaTogYW55KTogdm9pZCB7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24gKFxuICAgICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIGVsdDogRWxlbWVudCxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24gKHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbiAoXG4gICAgICAgIHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSxcbiAgICAgICAgdGFyZ2V0OiBOb2RlLFxuICAgICAgICBmcmFnbWVudDogTm9kZSxcbiAgICAgICAgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8sXG4gICAgKTogYm9vbGVhbiB8IE5vZGVbXSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgcGFyYW1ldGVyczogRm9ybURhdGEsXG4gICAgICAgIGVsdDogTm9kZSxcbiAgICApIHtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24gKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCB7Y3JlYXRlV2ViU29ja2V0Q2xpZW50fSBmcm9tIFwiLi4vdXRpbC93c1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn0iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5vbm9wZW4gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zb2xlLmxvZygnRXZlbnRTb3VyY2Ugb3BlbjonLCBldmVudCk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VPcGVuXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUVycm9yXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgaWYgKGV2ZW50U291cmNlLnJlYWR5U3RhdGUgPT0gRXZlbnRTb3VyY2UuQ0xPU0VEKSB7XG4gICAgICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0V2ZW50U291cmNlIG1lc3NhZ2U6JywgZXZlbnQuZGF0YSk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VCZWZvcmVNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5kYXRhXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZCwge3Rhc2tzOiBbXX0pO1xuICAgICAgICAgICAgLy8gc3VwcG9ydCBodG1nbyBldmFsX18gc2NyaXB0c1xuICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgY2hpbGQuaWQuc3RhcnRzV2l0aChcIl9fZXZhbFwiKSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VBZnRlck1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9wYXRoZGVwc1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2RlYnVnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3Jlc3BvbnNlLXRhcmdldHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3JcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbGl2ZXJlbG9hZFwiXG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2h0bWdvXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3NzZVwiXG5cbmZ1bmN0aW9uIHdhdGNoVXJsKGNhbGxiYWNrOiAob2xkVXJsOiBzdHJpbmcsIG5ld1VybDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGxldCBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHNldEludGVydmFsKCgpID0+IHtcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYgIT09IGxhc3RVcmwpIHtcbiAgICAgIGNhbGxiYWNrKGxhc3RVcmwsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgIGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG4gIH0sIDEwMCk7XG59XG5cbndhdGNoVXJsKChfLCBuZXdVcmwpID0+IHtcbiAgb25VcmxDaGFuZ2UobmV3VXJsKTtcbn0pO1xuXG5mdW5jdGlvbiBvblVybENoYW5nZShuZXdVcmw6IHN0cmluZykge1xuICBsZXQgdXJsID0gbmV3IFVSTChuZXdVcmwpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcl1cIikuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC10cmlnZ2VyXCIpO1xuICAgIGlmICghdHJpZ2dlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3BsaXQgPSB0cmlnZ2Vycy5zcGxpdChcIiwgXCIpO1xuICAgIGlmIChzcGxpdC5maW5kKChzKSA9PiBzID09PSBcInVybFwiKSkge1xuICAgICAgaHRteC5zd2FwKGVsZW1lbnQsIFwidXJsXCIsIHtcbiAgICAgICAgc3dhcFN0eWxlOiBcIm91dGVySFRNTFwiLFxuICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlc10gb2YgdXJsLnNlYXJjaFBhcmFtcykge1xuICAgICAgICBsZXQgZXZlbnROYW1lID0gXCJxczpcIiArIGtleTtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmluY2x1ZGVzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRyaWdnZXJpbmdcIiwgZXZlbnROYW1lKTtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgZXZlbnROYW1lLCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC1tYXRjaC1xcF1cIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBsZXQgaGFzTWF0Y2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGVsLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBuYW1lLnJlcGxhY2UoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiLCBcIlwiKTtcbiAgICAgICAgbGV0IHZhbHVlID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQobWF0Y2gpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBodG14LnN3YXAoZWwsIGVsLmdldEF0dHJpYnV0ZShuYW1lKSA/PyBcIlwiLCB7XG4gICAgICAgICAgICBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsXG4gICAgICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNNYXRjaCkge1xuICAgICAgbGV0IGRlZmF1bHRLZXkgPSBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1kZWZhdWx0XCIpO1xuICAgICAgaWYgKGRlZmF1bHRLZXkpIHtcbiAgICAgICAgaHRteC5zd2FwKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIgKyBkZWZhdWx0S2V5KSA/PyBcIlwiLFxuICAgICAgICAgIHsgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLCBzd2FwRGVsYXk6IDAsIHNldHRsZURlbGF5OiAwIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/framework/assets/js/htmxextensions/sse.ts b/framework/assets/js/htmxextensions/sse.ts index f422c5c..16cfe79 100644 --- a/framework/assets/js/htmxextensions/sse.ts +++ b/framework/assets/js/htmxextensions/sse.ts @@ -1,4 +1,5 @@ import htmx from 'htmx.org' +import {removeAssociatedScripts} from "./htmgo"; let api : any = null; let processed = new Set() @@ -14,6 +15,10 @@ htmx.defineExtension("sse", { return } + if(name === 'htmx:beforeCleanupElement') { + removeAssociatedScripts(target); + } + if(name === 'htmx:beforeProcessNode') { const elements = document.querySelectorAll('[sse-connect]'); for (let element of Array.from(elements)) { From f06feffb9e092245702e5801d2685cce9cc74015 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 22:39:30 -0500 Subject: [PATCH 18/28] forgot prod build tag --- examples/chat/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/chat/Dockerfile b/examples/chat/Dockerfile index c336569..5f9bc42 100644 --- a/examples/chat/Dockerfile +++ b/examples/chat/Dockerfile @@ -16,7 +16,7 @@ COPY . . # Build the Go binary for Linux RUN CGO_ENABLED=0 GOPRIVATE=github.com/maddalax LOG_LEVEL=debug go run github.com/maddalax/htmgo/cli/htmgo@8b816e956692683337d9fff6416ccc31f5047b59 build -RUN CGO_ENABLED=1 GOOS=linux go build -o ./dist -a -ldflags '-linkmode external -extldflags "-static"' . +RUN CGO_ENABLED=1 GOOS=linux go build -tags prod -o ./dist -a -ldflags '-linkmode external -extldflags "-static"' . # Stage 2: Create the smallest possible image From 5b60b9e915afc540c774e15168d7ecd209cb5451 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 23:04:04 -0500 Subject: [PATCH 19/28] fixes for error handling --- examples/chat/chat/broadcast.go | 4 +-- examples/chat/pages/chat.$id.go | 2 +- examples/chat/ws/handler.go | 26 +++++++--------- examples/chat/ws/manager.go | 38 ++++++++++++++++------- framework/assets/dist/htmgo.js | 4 +-- framework/assets/js/htmxextensions/sse.ts | 6 ++-- 6 files changed, 48 insertions(+), 32 deletions(-) diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 312eb7b..014f68a 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -47,14 +47,14 @@ func (m *Manager) OnConnected(e ws.SocketEvent) { room, _ := m.service.GetRoom(e.RoomId) if room == nil { - m.socketManager.CloseWithError(e.Id, 1008, "invalid room") + m.socketManager.CloseWithMessage(e.Id, "invalid room") return } user, err := m.queries.GetUserBySessionId(context.Background(), e.Id) if err != nil { - m.socketManager.CloseWithError(e.Id, 1008, "invalid user") + m.socketManager.CloseWithMessage(e.Id, "invalid user") return } diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 4191e16..2f9938a 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -28,7 +28,7 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { h.HxOnSseClose( js.EvalJs(fmt.Sprintf(` - const reason = e.detail.event.reason + const reason = e.detail.event.data if(['invalid room', 'no session', 'invalid user'].includes(reason)) { window.location.href = '/?roomId=%s'; } else if(e.detail.event.code === 1011) { diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go index 0f3ce68..0e9af55 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/ws/handler.go @@ -12,25 +12,32 @@ import ( func Handle() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + // Set the necessary headers + w.Header().Set("Content-Type", "text/event-stream") + w.Header().Set("Cache-Control", "no-cache") + w.Header().Set("Connection", "keep-alive") + w.Header().Set("Access-Control-Allow-Origin", "*") // Optional for CORS + cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) + locator := cc.ServiceLocator() + manager := service.Get[SocketManager](locator) + // Flush the headers immediately + flusher, ok := w.(http.Flusher) sessionCookie, _ := r.Cookie("session_id") if sessionCookie == nil { - slog.Error("session cookie not found") + manager.writeCloseRaw(w, flusher, "no session") return } - locator := cc.ServiceLocator() - manager := service.Get[SocketManager](locator) - sessionId := sessionCookie.Value roomId := chi.URLParam(r, "id") if roomId == "" { slog.Error("invalid room", slog.String("room_id", roomId)) - manager.CloseWithError(sessionId, 1008, "invalid room") + manager.writeCloseRaw(w, flusher, "invalid room") return } @@ -43,15 +50,6 @@ func Handle() http.HandlerFunc { manager.Disconnect(sessionId) }() - // Set the necessary headers - w.Header().Set("Content-Type", "text/event-stream") - w.Header().Set("Cache-Control", "no-cache") - w.Header().Set("Connection", "keep-alive") - w.Header().Set("Access-Control-Allow-Origin", "*") // Optional for CORS - - // Flush the headers immediately - flusher, ok := w.(http.Flusher) - if !ok { http.Error(w, "Streaming unsupported", http.StatusInternalServerError) return diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index fb25f7d..3c18cd1 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -126,12 +126,13 @@ func (manager *SocketManager) OnClose(id string) { manager.sockets.Delete(id) } -func (manager *SocketManager) CloseWithError(id string, code int, message string) { +func (manager *SocketManager) CloseWithMessage(id string, message string) { conn := manager.Get(id) if conn != nil { - go manager.OnClose(id) + defer manager.OnClose(id) + manager.writeText(*conn, "close", message) conn.Done <- CloseEvent{ - Code: code, + Code: -1, Reason: message, } } @@ -168,18 +169,33 @@ func (manager *SocketManager) Ping(id string) { } } +func (manager *SocketManager) writeCloseRaw(writer http.ResponseWriter, flusher http.Flusher, message string) { + err := manager.writeTextRaw(writer, "close", message) + if err == nil { + flusher.Flush() + } +} + +func (manager *SocketManager) writeTextRaw(writer http.ResponseWriter, event string, message string) error { + if writer == nil { + return nil + } + var err error + if event != "" { + _, err = fmt.Fprintf(writer, "event: %s\ndata: %s\n\n", event, message) + } else { + _, err = fmt.Fprintf(writer, "data: %s\n\n", message) + } + return err +} + func (manager *SocketManager) writeText(socket SocketConnection, event string, message string) { if socket.Writer == nil { return } - var err error - if event != "" { - _, err = fmt.Fprintf(socket.Writer, "event: %s\ndata: %s\n\n", event, message) - } else { - _, err = fmt.Fprintf(socket.Writer, "data: %s\n\n", message) - } - if err != nil { - manager.CloseWithError(socket.Id, 1008, "failed to write message") + err := manager.writeTextRaw(socket.Writer, event, message) + if err != nil && event != "close" { + manager.CloseWithMessage(socket.Id, "failed to write message") } socket.Flush <- true } diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index d691193..f28c22f 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},P=getClosestAttributeValue(n,"hx-prompt");if(P){var I=prompt(P);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,N=v.formData;o.values&&overrideFormData(N,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(N,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:F,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,F=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(F&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=F?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,k,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{k=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var B=null,K=new Set;h.defineExtension("sse",{init:function(e){B=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.onopen=function(r){console.log("EventSource open:",r),h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){console.log("EventSource message:",r.data),h.trigger(e,"htmx:sseBeforeMessage",{event:r});let o=r.data,i=B.makeFragment(o),s=Array.from(i.children);for(let l of s)B.oobSwap(B.getAttributeValue(l,"hx-swap-oob")||"true",l,{tasks:[]}),l.tagName==="SCRIPT"&&l.id.startsWith("__eval")&&document.body.appendChild(l);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},P=getClosestAttributeValue(n,"hx-prompt");if(P){var I=prompt(P);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,N=v.formData;o.values&&overrideFormData(N,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(N,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:F,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,F=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(F&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=F?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,k,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{k=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var B=null,K=new Set;h.defineExtension("sse",{init:function(e){B=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){h.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){h.trigger(e,"htmx:sseBeforeMessage",{event:r});let o=r.data,i=B.makeFragment(o),s=Array.from(i.children);for(let l of s)B.oobSwap(B.getAttributeValue(l,"hx-swap-oob")||"true",l,{tasks:[]}),l.tagName==="SCRIPT"&&l.id.startsWith("__eval")&&document.body.appendChild(l);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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Q0FBQUEsQ0FBUzJCLEVBQVcsSUFBSSxDQUFBLENBQ3JDLEtBQ0YsQ0FDRixDQUVKLENBQUMsQ0FFRCxDQUFBLFFBQUEsQ0FBUyxpQkFBaUIsZUFBZSxDQUFBLENBQUUsUUFBU2hHLENBQU8sRUFBQSxDQUN6RCxJQUFJcVYsQ0FBVyxDQUFBLENBQUEsQ0FBQSxDQUNmLFFBQVNyWCxDQUFRZ0MsSUFBQUEsQ0FBQUEsQ0FBRyxtQkFDbEIsQ0FBQSxHQUFJaEMsRUFBSyxVQUFXLENBQUEsc0JBQXNCLEVBQUcsQ0FDM0MsSUFBSWMsRUFBUWQsQ0FBSyxDQUFBLE9BQUEsQ0FBUSx1QkFBd0IsRUFBRSxDQUFBLENBRW5ELEdBRFk2QyxDQUFJLENBQUEsWUFBQSxDQUFhLElBQUkvQixDQUFLLENBQUEsQ0FDM0IsQ0FDVDhULENBQUssQ0FBQSxJQUFBLENBQUs1UyxDQUFJQSxDQUFBQSxDQUFBQSxDQUFHLFlBQWFoQyxDQUFBQSxDQUFJLEdBQUssRUFBSSxDQUFBLENBQ3pDLFVBQVcsV0FDWCxDQUFBLFNBQUEsQ0FBVyxFQUNYLFdBQWEsQ0FBQSxDQUNmLENBQUMsQ0FDRHFYLENBQUFBLENBQUFBLENBQVcsR0FDWCxLQUNGLENBQ0YsQ0FFRixHQUFJLENBQUNBLEVBQVUsQ0FDYixJQUFJQyxFQUFhdFYsQ0FBRyxDQUFBLFlBQUEsQ0FBYSxxQkFBcUIsQ0FDbERzVixDQUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXgsIHtIdG14U2V0dGxlSW5mbywgSHRteFN3YXBTdHlsZX0gZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwgZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaTogYW55KTogdm9pZCB7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24gKFxuICAgICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIGVsdDogRWxlbWVudCxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24gKHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbiAoXG4gICAgICAgIHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSxcbiAgICAgICAgdGFyZ2V0OiBOb2RlLFxuICAgICAgICBmcmFnbWVudDogTm9kZSxcbiAgICAgICAgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8sXG4gICAgKTogYm9vbGVhbiB8IE5vZGVbXSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgcGFyYW1ldGVyczogRm9ybURhdGEsXG4gICAgICAgIGVsdDogTm9kZSxcbiAgICApIHtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24gKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCB7Y3JlYXRlV2ViU29ja2V0Q2xpZW50fSBmcm9tIFwiLi4vdXRpbC93c1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn0iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5vbm9wZW4gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zb2xlLmxvZygnRXZlbnRTb3VyY2Ugb3BlbjonLCBldmVudCk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VPcGVuXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUVycm9yXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgaWYgKGV2ZW50U291cmNlLnJlYWR5U3RhdGUgPT0gRXZlbnRTb3VyY2UuQ0xPU0VEKSB7XG4gICAgICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0V2ZW50U291cmNlIG1lc3NhZ2U6JywgZXZlbnQuZGF0YSk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VCZWZvcmVNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5kYXRhXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZCwge3Rhc2tzOiBbXX0pO1xuICAgICAgICAgICAgLy8gc3VwcG9ydCBodG1nbyBldmFsX18gc2NyaXB0c1xuICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgY2hpbGQuaWQuc3RhcnRzV2l0aChcIl9fZXZhbFwiKSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VBZnRlck1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9wYXRoZGVwc1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2RlYnVnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3Jlc3BvbnNlLXRhcmdldHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3JcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbGl2ZXJlbG9hZFwiXG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2h0bWdvXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3NzZVwiXG5cbmZ1bmN0aW9uIHdhdGNoVXJsKGNhbGxiYWNrOiAob2xkVXJsOiBzdHJpbmcsIG5ld1VybDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGxldCBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHNldEludGVydmFsKCgpID0+IHtcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYgIT09IGxhc3RVcmwpIHtcbiAgICAgIGNhbGxiYWNrKGxhc3RVcmwsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgIGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG4gIH0sIDEwMCk7XG59XG5cbndhdGNoVXJsKChfLCBuZXdVcmwpID0+IHtcbiAgb25VcmxDaGFuZ2UobmV3VXJsKTtcbn0pO1xuXG5mdW5jdGlvbiBvblVybENoYW5nZShuZXdVcmw6IHN0cmluZykge1xuICBsZXQgdXJsID0gbmV3IFVSTChuZXdVcmwpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcl1cIikuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC10cmlnZ2VyXCIpO1xuICAgIGlmICghdHJpZ2dlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3BsaXQgPSB0cmlnZ2Vycy5zcGxpdChcIiwgXCIpO1xuICAgIGlmIChzcGxpdC5maW5kKChzKSA9PiBzID09PSBcInVybFwiKSkge1xuICAgICAgaHRteC5zd2FwKGVsZW1lbnQsIFwidXJsXCIsIHtcbiAgICAgICAgc3dhcFN0eWxlOiBcIm91dGVySFRNTFwiLFxuICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlc10gb2YgdXJsLnNlYXJjaFBhcmFtcykge1xuICAgICAgICBsZXQgZXZlbnROYW1lID0gXCJxczpcIiArIGtleTtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmluY2x1ZGVzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRyaWdnZXJpbmdcIiwgZXZlbnROYW1lKTtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgZXZlbnROYW1lLCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC1tYXRjaC1xcF1cIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBsZXQgaGFzTWF0Y2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGVsLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBuYW1lLnJlcGxhY2UoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiLCBcIlwiKTtcbiAgICAgICAgbGV0IHZhbHVlID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQobWF0Y2gpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBodG14LnN3YXAoZWwsIGVsLmdldEF0dHJpYnV0ZShuYW1lKSA/PyBcIlwiLCB7XG4gICAgICAgICAgICBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsXG4gICAgICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNNYXRjaCkge1xuICAgICAgbGV0IGRlZmF1bHRLZXkgPSBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1kZWZhdWx0XCIpO1xuICAgICAgaWYgKGRlZmF1bHRLZXkpIHtcbiAgICAgICAgaHRteC5zd2FwKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIgKyBkZWZhdWx0S2V5KSA/PyBcIlwiLFxuICAgICAgICAgIHsgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLCBzd2FwRGVsYXk6IDAsIHNldHRsZURlbGF5OiAwIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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VixDQUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXgsIHtIdG14U2V0dGxlSW5mbywgSHRteFN3YXBTdHlsZX0gZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwgZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaTogYW55KTogdm9pZCB7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24gKFxuICAgICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIGVsdDogRWxlbWVudCxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24gKHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbiAoXG4gICAgICAgIHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSxcbiAgICAgICAgdGFyZ2V0OiBOb2RlLFxuICAgICAgICBmcmFnbWVudDogTm9kZSxcbiAgICAgICAgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8sXG4gICAgKTogYm9vbGVhbiB8IE5vZGVbXSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgcGFyYW1ldGVyczogRm9ybURhdGEsXG4gICAgICAgIGVsdDogTm9kZSxcbiAgICApIHtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24gKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCB7Y3JlYXRlV2ViU29ja2V0Q2xpZW50fSBmcm9tIFwiLi4vdXRpbC93c1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn0iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9KVxuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZU9wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHt0YXNrczogW119KTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG5mdW5jdGlvbiB3YXRjaFVybChjYWxsYmFjazogKG9sZFVybDogc3RyaW5nLCBuZXdVcmw6IHN0cmluZykgPT4gdm9pZCkge1xuICBsZXQgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBsYXN0VXJsKSB7XG4gICAgICBjYWxsYmFjayhsYXN0VXJsLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuICB9LCAxMDApO1xufVxuXG53YXRjaFVybCgoXywgbmV3VXJsKSA9PiB7XG4gIG9uVXJsQ2hhbmdlKG5ld1VybCk7XG59KTtcblxuZnVuY3Rpb24gb25VcmxDaGFuZ2UobmV3VXJsOiBzdHJpbmcpIHtcbiAgbGV0IHVybCA9IG5ldyBVUkwobmV3VXJsKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXJdXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtdHJpZ2dlclwiKTtcbiAgICBpZiAoIXRyaWdnZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gdHJpZ2dlcnMuc3BsaXQoXCIsIFwiKTtcbiAgICBpZiAoc3BsaXQuZmluZCgocykgPT4gcyA9PT0gXCJ1cmxcIikpIHtcbiAgICAgIGh0bXguc3dhcChlbGVtZW50LCBcInVybFwiLCB7XG4gICAgICAgIHN3YXBTdHlsZTogXCJvdXRlckhUTUxcIixcbiAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZXNdIG9mIHVybC5zZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgbGV0IGV2ZW50TmFtZSA9IFwicXM6XCIgKyBrZXk7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5pbmNsdWRlcyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0cmlnZ2VyaW5nXCIsIGV2ZW50TmFtZSk7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIGV2ZW50TmFtZSwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtbWF0Y2gtcXBdXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBlbC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIikpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5yZXBsYWNlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiwgXCJcIik7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KG1hdGNoKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgaHRteC5zd2FwKGVsLCBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgPz8gXCJcIiwge1xuICAgICAgICAgICAgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLFxuICAgICAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGFzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzTWF0Y2gpIHtcbiAgICAgIGxldCBkZWZhdWx0S2V5ID0gZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtZGVmYXVsdFwiKTtcbiAgICAgIGlmIChkZWZhdWx0S2V5KSB7XG4gICAgICAgIGh0bXguc3dhcChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiICsgZGVmYXVsdEtleSkgPz8gXCJcIixcbiAgICAgICAgICB7IHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIiwgc3dhcERlbGF5OiAwLCBzZXR0bGVEZWxheTogMCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iXX0= \ No newline at end of file diff --git a/framework/assets/js/htmxextensions/sse.ts b/framework/assets/js/htmxextensions/sse.ts index 16cfe79..83c66e2 100644 --- a/framework/assets/js/htmxextensions/sse.ts +++ b/framework/assets/js/htmxextensions/sse.ts @@ -39,8 +39,11 @@ function connectEventSource(ele: Element, url: string) { console.info('Connecting to EventSource', url) const eventSource = new EventSource(url); + eventSource.addEventListener("close", function(event) { + htmx.trigger(ele, "htmx:sseClose", {event: event}); + }) + eventSource.onopen = function(event) { - console.log('EventSource open:', event); htmx.trigger(ele, "htmx:sseOpen", {event: event}); } @@ -52,7 +55,6 @@ function connectEventSource(ele: Element, url: string) { } eventSource.onmessage = function(event) { - console.log('EventSource message:', event.data); htmx.trigger(ele, "htmx:sseBeforeMessage", {event: event}); const response = event.data const fragment = api.makeFragment(response) as DocumentFragment; From 33b4b3299e17095f0c42cefdf6b19ffaeb40c845 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 2 Oct 2024 10:48:41 -0500 Subject: [PATCH 20/28] fixes with managing the sse connections --- examples/chat/chat/broadcast.go | 12 ++-- examples/chat/main.go | 11 ++++ examples/chat/ws/handler.go | 99 +++++++++++++++++++++------------ examples/chat/ws/manager.go | 58 ++++++++++--------- 4 files changed, 112 insertions(+), 68 deletions(-) diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 014f68a..6d68fdf 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -25,7 +25,7 @@ func NewManager(locator *service.Locator) *Manager { } func (m *Manager) StartListener() { - c := make(chan ws.SocketEvent) + c := make(chan ws.SocketEvent, 1) m.socketManager.Listen(c) for { @@ -33,11 +33,13 @@ func (m *Manager) StartListener() { case event := <-c: switch event.Type { case ws.ConnectedEvent: - m.OnConnected(event) + go m.OnConnected(event) case ws.DisconnectedEvent: - m.OnDisconnected(event) + go m.OnDisconnected(event) case ws.MessageEvent: - m.onMessage(event) + go m.onMessage(event) + default: + fmt.Printf("Unknown event type: %s\n", event.Type) } } } @@ -80,7 +82,7 @@ func (m *Manager) OnConnected(e ws.SocketEvent) { }, ) - go m.backFill(e.Id, e.RoomId) + m.backFill(e.Id, e.RoomId) } func (m *Manager) OnDisconnected(e ws.SocketEvent) { diff --git a/examples/chat/main.go b/examples/chat/main.go index 4cdff39..f8cf935 100644 --- a/examples/chat/main.go +++ b/examples/chat/main.go @@ -5,10 +5,13 @@ import ( "chat/chat" "chat/internal/db" "chat/ws" + "fmt" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" "io/fs" "net/http" + "runtime" + "time" ) func main() { @@ -22,6 +25,14 @@ func main() { chatManager := chat.NewManager(locator) go chatManager.StartListener() + go func() { + for { + count := runtime.NumGoroutine() + fmt.Printf("goroutines: %d\n", count) + time.Sleep(10 * time.Second) + } + }() + h.Start(h.AppOpts{ ServiceLocator: locator, LiveReload: true, diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go index 0e9af55..3caca7d 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/ws/handler.go @@ -7,6 +7,7 @@ import ( "github.com/maddalax/htmgo/framework/service" "log/slog" "net/http" + "sync" "time" ) @@ -21,55 +22,79 @@ func Handle() http.HandlerFunc { cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) locator := cc.ServiceLocator() manager := service.Get[SocketManager](locator) - // Flush the headers immediately - flusher, ok := w.(http.Flusher) sessionCookie, _ := r.Cookie("session_id") + sessionId := "" - if sessionCookie == nil { - manager.writeCloseRaw(w, flusher, "no session") - return + if sessionCookie != nil { + sessionId = sessionCookie.Value } - sessionId := sessionCookie.Value + ctx := r.Context() + done := make(chan CloseEvent, 1) + writer := make(WriterChan, 1) - roomId := chi.URLParam(r, "id") + wg := sync.WaitGroup{} + wg.Add(1) - if roomId == "" { - slog.Error("invalid room", slog.String("room_id", roomId)) - manager.writeCloseRaw(w, flusher, "invalid room") - return - } + /* + * This goroutine is responsible for writing messages to the client + */ + go func() { + defer wg.Done() + defer manager.Disconnect(sessionId) - done := make(chan CloseEvent, 50) - flush := make(chan bool, 50) + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() - manager.Add(roomId, sessionId, w, done, flush) - - defer func() { - manager.Disconnect(sessionId) + for { + select { + case <-ctx.Done(): + return + case reason := <-done: + fmt.Printf("closing connection: %s\n", reason.Reason) + return + case <-ticker.C: + manager.Ping(sessionId) + case message := <-writer: + _, err := fmt.Fprintf(w, message) + if err != nil { + done <- CloseEvent{ + Code: -1, + Reason: err.Error(), + } + } else { + flusher, ok := w.(http.Flusher) + if ok { + flusher.Flush() + } + } + } + } }() - if !ok { - http.Error(w, "Streaming unsupported", http.StatusInternalServerError) - return - } - - ticker := time.NewTicker(5 * time.Second) - defer ticker.Stop() - - for { - select { - case <-ticker.C: - manager.Ping(sessionId) - case <-flush: - if flusher != nil { - flusher.Flush() - } - case <-done: // Client closed the connection - fmt.Println("Client disconnected") + /** + * This goroutine is responsible for adding the client to the room + */ + wg.Add(1) + go func() { + defer wg.Done() + if sessionId == "" { + manager.writeCloseRaw(writer, "no session") return } - } + + roomId := chi.URLParam(r, "id") + + if roomId == "" { + slog.Error("invalid room", slog.String("room_id", roomId)) + manager.writeCloseRaw(writer, "invalid room") + return + } + + manager.Add(roomId, sessionId, writer, done) + }() + + wg.Wait() } } diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index 3c18cd1..d655542 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -3,10 +3,12 @@ package ws import ( "fmt" "github.com/puzpuzpuz/xsync/v3" - "net/http" + "time" ) type EventType string +type WriterChan chan string +type DoneChan chan CloseEvent const ( ConnectedEvent EventType = "connected" @@ -28,10 +30,9 @@ type CloseEvent struct { type SocketConnection struct { Id string - Writer http.ResponseWriter RoomId string - Done chan CloseEvent - Flush chan bool + Done DoneChan + Writer WriterChan } type SocketManager struct { @@ -62,13 +63,29 @@ func (manager *SocketManager) Listen(listener chan SocketEvent) { if manager.listeners == nil { manager.listeners = make([]chan SocketEvent, 0) } - manager.listeners = append(manager.listeners, listener) + if listener != nil { + manager.listeners = append(manager.listeners, listener) + } } func (manager *SocketManager) dispatch(event SocketEvent) { + fmt.Printf("dispatching event: %s\n", event.Type) + done := make(chan struct{}, 1) + go func() { + for { + select { + case <-done: + fmt.Printf("dispatched event: %s\n", event.Type) + return + case <-time.After(5 * time.Second): + fmt.Printf("havent dispatched event after 5s, chan blocked: %s\n", event.Type) + } + } + }() for _, listener := range manager.listeners { listener <- event } + done <- struct{}{} } func (manager *SocketManager) OnMessage(id string, message map[string]any) { @@ -84,7 +101,7 @@ func (manager *SocketManager) OnMessage(id string, message map[string]any) { }) } -func (manager *SocketManager) Add(roomId string, id string, writer http.ResponseWriter, done chan CloseEvent, flush chan bool) { +func (manager *SocketManager) Add(roomId string, id string, writer chan string, done chan CloseEvent) { manager.idToRoom.Store(id, roomId) sockets, ok := manager.sockets.LoadOrCompute(roomId, func() *xsync.MapOf[string, SocketConnection] { @@ -96,7 +113,6 @@ func (manager *SocketManager) Add(roomId string, id string, writer http.Response Writer: writer, RoomId: roomId, Done: done, - Flush: flush, }) s, ok := sockets.Load(id) @@ -110,6 +126,8 @@ func (manager *SocketManager) Add(roomId string, id string, writer http.Response RoomId: s.RoomId, Payload: map[string]any{}, }) + + fmt.Printf("User %s connected to %s\n", id, roomId) } func (manager *SocketManager) OnClose(id string) { @@ -141,7 +159,7 @@ func (manager *SocketManager) CloseWithMessage(id string, message string) { func (manager *SocketManager) Disconnect(id string) { conn := manager.Get(id) if conn != nil { - go manager.OnClose(id) + manager.OnClose(id) conn.Done <- CloseEvent{ Code: -1, Reason: "", @@ -169,35 +187,23 @@ func (manager *SocketManager) Ping(id string) { } } -func (manager *SocketManager) writeCloseRaw(writer http.ResponseWriter, flusher http.Flusher, message string) { - err := manager.writeTextRaw(writer, "close", message) - if err == nil { - flusher.Flush() - } +func (manager *SocketManager) writeCloseRaw(writer WriterChan, message string) { + manager.writeTextRaw(writer, "close", message) } -func (manager *SocketManager) writeTextRaw(writer http.ResponseWriter, event string, message string) error { - if writer == nil { - return nil - } - var err error +func (manager *SocketManager) writeTextRaw(writer WriterChan, event string, message string) { if event != "" { - _, err = fmt.Fprintf(writer, "event: %s\ndata: %s\n\n", event, message) + writer <- fmt.Sprintf("event: %s\ndata: %s\n\n", event, message) } else { - _, err = fmt.Fprintf(writer, "data: %s\n\n", message) + writer <- fmt.Sprintf("data: %s\n\n", message) } - return err } func (manager *SocketManager) writeText(socket SocketConnection, event string, message string) { if socket.Writer == nil { return } - err := manager.writeTextRaw(socket.Writer, event, message) - if err != nil && event != "close" { - manager.CloseWithMessage(socket.Id, "failed to write message") - } - socket.Flush <- true + manager.writeTextRaw(socket.Writer, event, message) } func (manager *SocketManager) BroadcastText(roomId string, message string, predicate func(conn SocketConnection) bool) { From d739ef3758948a66f35505f84196602b2170d8d4 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 2 Oct 2024 11:06:00 -0500 Subject: [PATCH 21/28] fix issues with error handling --- examples/chat/pages/chat.$id.go | 2 +- examples/chat/ws/handler.go | 11 ++++------- examples/chat/ws/manager.go | 16 +++++----------- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 2f9938a..497b52e 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -26,7 +26,7 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { js.ConsoleLog("Connected to chat room"), ), - h.HxOnSseClose( + h.HxOnSseError( js.EvalJs(fmt.Sprintf(` const reason = e.detail.event.data if(['invalid room', 'no session', 'invalid user'].includes(reason)) { diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go index 3caca7d..e6a7060 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/ws/handler.go @@ -31,7 +31,7 @@ func Handle() http.HandlerFunc { } ctx := r.Context() - done := make(chan CloseEvent, 1) + done := make(chan bool, 1) writer := make(WriterChan, 1) wg := sync.WaitGroup{} @@ -51,18 +51,15 @@ func Handle() http.HandlerFunc { select { case <-ctx.Done(): return - case reason := <-done: - fmt.Printf("closing connection: %s\n", reason.Reason) + case <-done: + fmt.Printf("closing connection: \n") return case <-ticker.C: manager.Ping(sessionId) case message := <-writer: _, err := fmt.Fprintf(w, message) if err != nil { - done <- CloseEvent{ - Code: -1, - Reason: err.Error(), - } + done <- true } else { flusher, ok := w.(http.Flusher) if ok { diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index d655542..f4dbb9b 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -8,7 +8,7 @@ import ( type EventType string type WriterChan chan string -type DoneChan chan CloseEvent +type DoneChan chan bool const ( ConnectedEvent EventType = "connected" @@ -101,7 +101,7 @@ func (manager *SocketManager) OnMessage(id string, message map[string]any) { }) } -func (manager *SocketManager) Add(roomId string, id string, writer chan string, done chan CloseEvent) { +func (manager *SocketManager) Add(roomId string, id string, writer WriterChan, done DoneChan) { manager.idToRoom.Store(id, roomId) sockets, ok := manager.sockets.LoadOrCompute(roomId, func() *xsync.MapOf[string, SocketConnection] { @@ -148,11 +148,8 @@ func (manager *SocketManager) CloseWithMessage(id string, message string) { conn := manager.Get(id) if conn != nil { defer manager.OnClose(id) - manager.writeText(*conn, "close", message) - conn.Done <- CloseEvent{ - Code: -1, - Reason: message, - } + manager.writeText(*conn, "error", message) + conn.Done <- true } } @@ -160,10 +157,7 @@ func (manager *SocketManager) Disconnect(id string) { conn := manager.Get(id) if conn != nil { manager.OnClose(id) - conn.Done <- CloseEvent{ - Code: -1, - Reason: "", - } + conn.Done <- true } } From 6ea3f77b62c1dcd9dcea59b0f6d07154e397e1f1 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 2 Oct 2024 12:10:04 -0500 Subject: [PATCH 22/28] fix issues with channel buffer size --- examples/chat/chat/broadcast.go | 6 ++--- examples/chat/internal/routine/goroutine.go | 25 +++++++++++++++++++++ examples/chat/ws/handler.go | 19 ++++++++++++++-- examples/chat/ws/manager.go | 13 ++++++----- 4 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 examples/chat/internal/routine/goroutine.go diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 6d68fdf..4c76de4 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -33,11 +33,11 @@ func (m *Manager) StartListener() { case event := <-c: switch event.Type { case ws.ConnectedEvent: - go m.OnConnected(event) + m.OnConnected(event) case ws.DisconnectedEvent: - go m.OnDisconnected(event) + m.OnDisconnected(event) case ws.MessageEvent: - go m.onMessage(event) + m.onMessage(event) default: fmt.Printf("Unknown event type: %s\n", event.Type) } diff --git a/examples/chat/internal/routine/goroutine.go b/examples/chat/internal/routine/goroutine.go new file mode 100644 index 0000000..144f68a --- /dev/null +++ b/examples/chat/internal/routine/goroutine.go @@ -0,0 +1,25 @@ +package routine + +import ( + "fmt" + "time" +) + +func DebugLongRunning(name string, f func()) { + now := time.Now() + done := make(chan struct{}, 1) + go func() { + ticker := time.NewTicker(time.Second * 5) + for { + select { + case <-done: + return + case <-ticker.C: + elapsed := time.Since(now).Milliseconds() + fmt.Printf("function %s has not finished after %dms\n", name, elapsed) + } + } + }() + f() + done <- struct{}{} +} diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go index e6a7060..04a2a8d 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/ws/handler.go @@ -31,8 +31,13 @@ func Handle() http.HandlerFunc { } ctx := r.Context() - done := make(chan bool, 1) - writer := make(WriterChan, 1) + + /* + Large buffer in case the client disconnects while we are writing + we don't want to block the writer + */ + done := make(chan bool, 1000) + writer := make(WriterChan, 1000) wg := sync.WaitGroup{} wg.Add(1) @@ -44,6 +49,16 @@ func Handle() http.HandlerFunc { defer wg.Done() defer manager.Disconnect(sessionId) + defer func() { + fmt.Printf("empting channels\n") + for len(writer) > 0 { + <-writer + } + for len(done) > 0 { + <-done + } + }() + ticker := time.NewTicker(5 * time.Second) defer ticker.Stop() diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index f4dbb9b..4d653f1 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -1,6 +1,7 @@ package ws import ( + "chat/internal/routine" "fmt" "github.com/puzpuzpuz/xsync/v3" "time" @@ -186,11 +187,13 @@ func (manager *SocketManager) writeCloseRaw(writer WriterChan, message string) { } func (manager *SocketManager) writeTextRaw(writer WriterChan, event string, message string) { - if event != "" { - writer <- fmt.Sprintf("event: %s\ndata: %s\n\n", event, message) - } else { - writer <- fmt.Sprintf("data: %s\n\n", message) - } + routine.DebugLongRunning("writeTextRaw", func() { + if event != "" { + writer <- fmt.Sprintf("event: %s\ndata: %s\n\n", event, message) + } else { + writer <- fmt.Sprintf("data: %s\n\n", message) + } + }) } func (manager *SocketManager) writeText(socket SocketConnection, event string, message string) { From deb87dceed46ae5bc0797c2f9149f046a388ed80 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 2 Oct 2024 12:56:11 -0500 Subject: [PATCH 23/28] test --- examples/chat/ws/manager.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index 4d653f1..afb3a11 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -188,10 +188,19 @@ func (manager *SocketManager) writeCloseRaw(writer WriterChan, message string) { func (manager *SocketManager) writeTextRaw(writer WriterChan, event string, message string) { routine.DebugLongRunning("writeTextRaw", func() { + timeout := 3 * time.Second + data := "" if event != "" { - writer <- fmt.Sprintf("event: %s\ndata: %s\n\n", event, message) + data = fmt.Sprintf("event: %s\ndata: %s\n\n", event, message) } else { - writer <- fmt.Sprintf("data: %s\n\n", message) + data = fmt.Sprintf("data: %s\n\n", message) + } + fmt.Printf("writing to channel:\n") + select { + case writer <- data: + fmt.Println("Sent to the channel") + case <-time.After(timeout): + fmt.Printf("could not send %s to channel after %s\n", data, timeout) } }) } From aa6d311fa8ee68f5bd19a8701f11c9ea88aebf23 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 3 Oct 2024 11:38:40 -0500 Subject: [PATCH 24/28] sidebar fixes --- examples/chat/chat/broadcast.go | 43 +++++++++++++---------- examples/chat/chat/component.go | 16 ++++----- examples/chat/pages/chat.$id.go | 3 +- examples/chat/ws/manager.go | 2 -- framework/assets/dist/htmgo.js | 4 +-- framework/assets/js/htmxextensions/sse.ts | 3 +- 6 files changed, 37 insertions(+), 34 deletions(-) diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 4c76de4..64ae082 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -45,6 +45,27 @@ func (m *Manager) StartListener() { } } +func (m *Manager) dispatchConnectedUsers(roomId string, predicate func(conn ws.SocketConnection) bool) { + + connectedUsers := make([]db.User, 0) + + // backfill all existing clients to the connected client + m.socketManager.ForEachSocket(roomId, func(conn ws.SocketConnection) { + if !predicate(conn) { + return + } + user, err := m.queries.GetUserBySessionId(context.Background(), conn.Id) + if err != nil { + return + } + connectedUsers = append(connectedUsers, user) + }) + + m.socketManager.ForEachSocket(roomId, func(conn ws.SocketConnection) { + m.socketManager.SendText(conn.Id, h.Render(ConnectedUsers(connectedUsers, conn.Id))) + }) +} + func (m *Manager) OnConnected(e ws.SocketEvent) { room, _ := m.service.GetRoom(e.RoomId) @@ -62,26 +83,10 @@ func (m *Manager) OnConnected(e ws.SocketEvent) { fmt.Printf("User %s connected to %s\n", user.Name, e.RoomId) - // backfill all existing clients to the connected client - m.socketManager.ForEachSocket(e.RoomId, func(conn ws.SocketConnection) { - user, err := m.queries.GetUserBySessionId(context.Background(), conn.Id) - if err != nil { - return - } - isMe := conn.Id == e.Id - fmt.Printf("Sending connected user %s to %s\n", user.Name, e.Id) - m.socketManager.SendText(e.Id, h.Render(ConnectedUsers(user.Name, isMe))) + m.dispatchConnectedUsers(e.RoomId, func(conn ws.SocketConnection) bool { + return true }) - // send the connected user to all existing clients - m.socketManager.BroadcastText( - e.RoomId, - h.Render(ConnectedUsers(user.Name, false)), - func(conn ws.SocketConnection) bool { - return conn.Id != e.Id - }, - ) - m.backFill(e.Id, e.RoomId) } @@ -95,7 +100,7 @@ func (m *Manager) OnDisconnected(e ws.SocketEvent) { return } fmt.Printf("User %s disconnected from %s\n", user.Name, room.ID) - m.socketManager.BroadcastText(room.ID, h.Render(ConnectedUser(user.Name, true, false)), func(conn ws.SocketConnection) bool { + m.dispatchConnectedUsers(e.RoomId, func(conn ws.SocketConnection) bool { return conn.Id != e.Id }) } diff --git a/examples/chat/chat/component.go b/examples/chat/chat/component.go index bf7c18d..f81adbf 100644 --- a/examples/chat/chat/component.go +++ b/examples/chat/chat/component.go @@ -1,6 +1,7 @@ package chat import ( + "chat/internal/db" "fmt" "github.com/maddalax/htmgo/framework/h" "strings" @@ -27,22 +28,19 @@ func MessageRow(message *Message) *h.Element { ) } -func ConnectedUsers(username string, isMe bool) *h.Element { +func ConnectedUsers(users []db.User, myId string) *h.Element { return h.Ul( - h.Attribute("hx-swap", "none"), - h.Attribute("hx-swap-oob", "beforeend"), + h.Attribute("hx-swap-oob", "outerHTML"), h.Id("connected-users"), h.Class("flex flex-col"), - // This would be populated dynamically with connected users - ConnectedUser(username, false, isMe), + h.List(users, func(user db.User, index int) *h.Element { + return connectedUser(user.Name, user.SessionID == myId) + }), ) } -func ConnectedUser(username string, remove bool, isMe bool) *h.Element { +func connectedUser(username string, isMe bool) *h.Element { id := fmt.Sprintf("connected-user-%s", strings.ReplaceAll(username, "#", "-")) - if remove { - return h.Div(h.Id(id), h.Attribute("hx-swap-oob", "delete")) - } return h.Li( h.Id(id), h.ClassX("truncate text-slate-700", h.ClassMap{ diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 497b52e..7463c7b 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -2,6 +2,7 @@ package pages import ( "chat/chat" + "chat/internal/db" "chat/partials" "fmt" "github.com/go-chi/chi/v5" @@ -111,7 +112,7 @@ func UserSidebar() *h.Element { h.Class("pt-[67px] min-w-48 w-48 bg-neutral-200 p-4 flex flex-col justify-between gap-3 rounded-l-lg"), h.Div( h.H3F("Connected Users", h.Class("text-lg font-bold")), - chat.ConnectedUsers("", false), + chat.ConnectedUsers(make([]db.User, 0), ""), ), h.A( h.Class("cursor-pointer"), diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index afb3a11..10f842f 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -195,10 +195,8 @@ func (manager *SocketManager) writeTextRaw(writer WriterChan, event string, mess } else { data = fmt.Sprintf("data: %s\n\n", message) } - fmt.Printf("writing to channel:\n") select { case writer <- data: - fmt.Println("Sent to the channel") case <-time.After(timeout): fmt.Printf("could not send %s to channel after %s\n", data, timeout) } diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index f28c22f..f40bb7b 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},P=getClosestAttributeValue(n,"hx-prompt");if(P){var I=prompt(P);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,N=v.formData;o.values&&overrideFormData(N,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(N,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:F,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,F=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(F&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=F?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,k,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{k=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var B=null,K=new Set;h.defineExtension("sse",{init:function(e){B=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){h.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){h.trigger(e,"htmx:sseBeforeMessage",{event:r});let o=r.data,i=B.makeFragment(o),s=Array.from(i.children);for(let l of s)B.oobSwap(B.getAttributeValue(l,"hx-swap-oob")||"true",l,{tasks:[]}),l.tagName==="SCRIPT"&&l.id.startsWith("__eval")&&document.body.appendChild(l);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,U,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{U=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;h.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){h.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);h.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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VixDQUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXgsIHtIdG14U2V0dGxlSW5mbywgSHRteFN3YXBTdHlsZX0gZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwgZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaTogYW55KTogdm9pZCB7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24gKFxuICAgICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIGVsdDogRWxlbWVudCxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24gKHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbiAoXG4gICAgICAgIHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSxcbiAgICAgICAgdGFyZ2V0OiBOb2RlLFxuICAgICAgICBmcmFnbWVudDogTm9kZSxcbiAgICAgICAgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8sXG4gICAgKTogYm9vbGVhbiB8IE5vZGVbXSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgcGFyYW1ldGVyczogRm9ybURhdGEsXG4gICAgICAgIGVsdDogTm9kZSxcbiAgICApIHtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24gKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCB7Y3JlYXRlV2ViU29ja2V0Q2xpZW50fSBmcm9tIFwiLi4vdXRpbC93c1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn0iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9KVxuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZU9wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHt0YXNrczogW119KTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG5mdW5jdGlvbiB3YXRjaFVybChjYWxsYmFjazogKG9sZFVybDogc3RyaW5nLCBuZXdVcmw6IHN0cmluZykgPT4gdm9pZCkge1xuICBsZXQgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBsYXN0VXJsKSB7XG4gICAgICBjYWxsYmFjayhsYXN0VXJsLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuICB9LCAxMDApO1xufVxuXG53YXRjaFVybCgoXywgbmV3VXJsKSA9PiB7XG4gIG9uVXJsQ2hhbmdlKG5ld1VybCk7XG59KTtcblxuZnVuY3Rpb24gb25VcmxDaGFuZ2UobmV3VXJsOiBzdHJpbmcpIHtcbiAgbGV0IHVybCA9IG5ldyBVUkwobmV3VXJsKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXJdXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtdHJpZ2dlclwiKTtcbiAgICBpZiAoIXRyaWdnZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gdHJpZ2dlcnMuc3BsaXQoXCIsIFwiKTtcbiAgICBpZiAoc3BsaXQuZmluZCgocykgPT4gcyA9PT0gXCJ1cmxcIikpIHtcbiAgICAgIGh0bXguc3dhcChlbGVtZW50LCBcInVybFwiLCB7XG4gICAgICAgIHN3YXBTdHlsZTogXCJvdXRlckhUTUxcIixcbiAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZXNdIG9mIHVybC5zZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgbGV0IGV2ZW50TmFtZSA9IFwicXM6XCIgKyBrZXk7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5pbmNsdWRlcyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0cmlnZ2VyaW5nXCIsIGV2ZW50TmFtZSk7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIGV2ZW50TmFtZSwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtbWF0Y2gtcXBdXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBlbC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIikpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5yZXBsYWNlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiwgXCJcIik7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KG1hdGNoKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgaHRteC5zd2FwKGVsLCBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgPz8gXCJcIiwge1xuICAgICAgICAgICAgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLFxuICAgICAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGFzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzTWF0Y2gpIHtcbiAgICAgIGxldCBkZWZhdWx0S2V5ID0gZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtZGVmYXVsdFwiKTtcbiAgICAgIGlmIChkZWZhdWx0S2V5KSB7XG4gICAgICAgIGh0bXguc3dhcChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiICsgZGVmYXVsdEtleSkgPz8gXCJcIixcbiAgICAgICAgICB7IHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIiwgc3dhcERlbGF5OiAwLCBzZXR0bGVEZWxheTogMCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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QUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXgsIHtIdG14U2V0dGxlSW5mbywgSHRteFN3YXBTdHlsZX0gZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwgZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaTogYW55KTogdm9pZCB7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24gKFxuICAgICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIGVsdDogRWxlbWVudCxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24gKHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbiAoXG4gICAgICAgIHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSxcbiAgICAgICAgdGFyZ2V0OiBOb2RlLFxuICAgICAgICBmcmFnbWVudDogTm9kZSxcbiAgICAgICAgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8sXG4gICAgKTogYm9vbGVhbiB8IE5vZGVbXSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgcGFyYW1ldGVyczogRm9ybURhdGEsXG4gICAgICAgIGVsdDogTm9kZSxcbiAgICApIHtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24gKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCB7Y3JlYXRlV2ViU29ja2V0Q2xpZW50fSBmcm9tIFwiLi4vdXRpbC93c1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn0iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9KVxuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZU9wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gYXBpLm1ha2VTZXR0bGVJbmZvKGVsZSk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VCZWZvcmVNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5kYXRhXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZCwgc2V0dGxlSW5mbyk7XG4gICAgICAgICAgICAvLyBzdXBwb3J0IGh0bWdvIGV2YWxfXyBzY3JpcHRzXG4gICAgICAgICAgICBpZihjaGlsZC50YWdOYW1lID09PSAnU0NSSVBUJyAmJiBjaGlsZC5pZC5zdGFydHNXaXRoKFwiX19ldmFsXCIpKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUFmdGVyTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3BhdGhkZXBzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3RyaWdnZXItY2hpbGRyZW5cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvZGVidWdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcmVzcG9uc2UtdGFyZ2V0c1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9tdXRhdGlvbi1lcnJvclwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkXCJcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvaHRtZ29cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvc3NlXCJcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file diff --git a/framework/assets/js/htmxextensions/sse.ts b/framework/assets/js/htmxextensions/sse.ts index 83c66e2..b4b7a19 100644 --- a/framework/assets/js/htmxextensions/sse.ts +++ b/framework/assets/js/htmxextensions/sse.ts @@ -55,12 +55,13 @@ function connectEventSource(ele: Element, url: string) { } eventSource.onmessage = function(event) { + const settleInfo = api.makeSettleInfo(ele); htmx.trigger(ele, "htmx:sseBeforeMessage", {event: event}); const response = event.data const fragment = api.makeFragment(response) as DocumentFragment; const children = Array.from(fragment.children); for (let child of children) { - api.oobSwap(api.getAttributeValue(child, 'hx-swap-oob') || 'true', child, {tasks: []}); + api.oobSwap(api.getAttributeValue(child, 'hx-swap-oob') || 'true', child, settleInfo); // support htmgo eval__ scripts if(child.tagName === 'SCRIPT' && child.id.startsWith("__eval")) { document.body.appendChild(child); From a06f5fea120decb15d4f505753ddd352acd4ac2d Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 3 Oct 2024 12:04:49 -0500 Subject: [PATCH 25/28] css fixes --- examples/chat/pages/chat.$id.go | 41 +++++++++++++++++++++++---------- examples/chat/pages/root.go | 4 ++++ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 7463c7b..1b71761 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -35,27 +35,29 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { } else if(e.detail.event.code === 1011) { window.location.reload() } else if (e.detail.event.code === 1008 || e.detail.event.code === 1006) { - window.location.href = '/?roomId=%s'; + window.location.href = '/?roomId=%s'; } else { console.error('Connection closed:', e.detail.event) } `, roomId, roomId)), ), - h.Class("flex flex-row min-h-screen bg-neutral-100"), + // Adjusted flex properties for responsive layout + h.Class("flex flex-row h-screen bg-neutral-100"), + + // Collapse Button for mobile + CollapseButton(), // Sidebar for connected users UserSidebar(), h.Div( - h.Class("flex flex-col flex-grow bg-white rounded p-4"), + // Adjusted to fill height and width + h.Class("flex flex-col h-full w-full bg-white p-4 overflow-hidden"), // Room name at the top, fixed CachedRoomHeader(ctx), - // Padding to push chat content below the fixed room name - h.Div(h.Class("pt-[50px]")), - h.HxAfterSseMessage( js.EvalJsOnSibling("#messages", `element.scrollTop = element.scrollHeight;`), @@ -64,14 +66,12 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { // Chat Messages h.Div( h.Id("messages"), - h.Class("flex flex-col gap-4 overflow-auto grow w-full mb-4 max-w-[calc(100%-215px)]"), + // Adjusted flex properties and removed max-width + h.Class("flex flex-col gap-4 mb-4 overflow-auto flex-grow w-full pt-[50px]"), ), // Chat Input at the bottom - h.Div( - h.Class("mt-auto"), - Form(), - ), + Form(), ), ), ), @@ -109,7 +109,7 @@ func roomNameHeader(ctx *h.RequestContext) *h.Element { func UserSidebar() *h.Element { return h.Div( - h.Class("pt-[67px] min-w-48 w-48 bg-neutral-200 p-4 flex flex-col justify-between gap-3 rounded-l-lg"), + h.Class("sidebar h-full pt-[67px] min-w-48 w-48 bg-neutral-200 p-4 flex-col justify-between gap-3 rounded-l-lg hidden md:flex"), h.Div( h.H3F("Connected Users", h.Class("text-lg font-bold")), chat.ConnectedUsers(make([]db.User, 0), ""), @@ -122,6 +122,23 @@ func UserSidebar() *h.Element { ) } +func CollapseButton() *h.Element { + return h.Div( + h.Class("fixed top-0 left-4 md:hidden z-50"), // Always visible on mobile + h.Button( + h.Class("p-2 text-2xl bg-neutral-700 text-white rounded-md"), // Styling the button + h.OnClick( + js.EvalJs(` + const sidebar = document.querySelector('.sidebar'); + sidebar.classList.toggle('hidden'); + sidebar.classList.toggle('flex'); + `), + ), + h.UnsafeRaw("☰"), // The icon for collapsing the sidebar + ), + ) +} + func MessageInput() *h.Element { return h.Input("text", h.Id("message-input"), diff --git a/examples/chat/pages/root.go b/examples/chat/pages/root.go index 806a882..c566cf2 100644 --- a/examples/chat/pages/root.go +++ b/examples/chat/pages/root.go @@ -8,6 +8,10 @@ func RootPage(children ...h.Ren) h.Ren { extensions := h.BaseExtensions() return h.Html( h.HxExtension(extensions), + h.Meta("viewport", "width=device-width, initial-scale=1"), + h.Meta("title", "htmgo chat example"), + h.Meta("charset", "utf-8"), + h.Meta("author", "htmgo"), h.Head( h.Link("/public/main.css", "stylesheet"), h.Script("/public/htmgo.js"), From 496981efd0869353e54c073764149df044ab4424 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 3 Oct 2024 15:35:19 -0500 Subject: [PATCH 26/28] fix tests --- framework/h/command_test.go | 9 ++++++--- framework/h/lifecycle.go | 7 +------ framework/h/render_test.go | 2 +- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/framework/h/command_test.go b/framework/h/command_test.go index 3743381..0da8afb 100644 --- a/framework/h/command_test.go +++ b/framework/h/command_test.go @@ -32,17 +32,20 @@ func renderJs(t *testing.T, command Command) string { value := parsed.FirstChild.FirstChild.NextSibling.LastChild.Attr[0].Val isComplex := strings.HasPrefix(value, "__eval_") if !isComplex { - return value + value = strings.ReplaceAll(value, "var e=event;", "") + return strings.ReplaceAll(value, "var self=this;", "") } else { - id := strings.TrimSuffix(value, "(this);") + id := strings.TrimSuffix(value, "(this, event);") script := findScriptById(parsed, id) assert.NotNil(t, script) funcCall := script.LastChild.Data funcCall = strings.ReplaceAll(funcCall, "\n", "") funcCall = strings.ReplaceAll(funcCall, "\t", "") - start := fmt.Sprintf("function %s(self) {", id) + start := fmt.Sprintf("function %s(self, event) {", id) funcCall = strings.TrimPrefix(funcCall, start) funcCall = strings.TrimSuffix(funcCall, "}") + funcCall = strings.ReplaceAll(funcCall, "let e = event;", "") + funcCall = strings.ReplaceAll(funcCall, "var self=this;", "") return funcCall } } diff --git a/framework/h/lifecycle.go b/framework/h/lifecycle.go index 295b50d..1dd199a 100644 --- a/framework/h/lifecycle.go +++ b/framework/h/lifecycle.go @@ -307,12 +307,7 @@ func SetValue(value string) SimpleJsCommand { func SubmitFormOnEnter() ComplexJsCommand { // language=JavaScript return EvalJs(` - if (event.code === 'Enter') { - console.log('submitting form'); - setTimeout(() => { - self.form.dispatchEvent(new Event('submit', { cancelable: true })); - }, 250) - } + if (event.code === 'Enter') { self.form.dispatchEvent(new Event('submit', { cancelable: true })); } `) } diff --git a/framework/h/render_test.go b/framework/h/render_test.go index 10a6662..b38a8df 100644 --- a/framework/h/render_test.go +++ b/framework/h/render_test.go @@ -46,7 +46,7 @@ func TestRender(t *testing.T) { assert.Equal(t, expected, - result) + strings.ReplaceAll(result, "var self=this;var e=event;", "")) } func TestRenderAttributes_1(t *testing.T) { From e6af7a73d548110545a41abd8ae7a358a272409d Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 3 Oct 2024 15:41:09 -0500 Subject: [PATCH 27/28] fix test --- framework/h/render_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/framework/h/render_test.go b/framework/h/render_test.go index b38a8df..dbbd1e1 100644 --- a/framework/h/render_test.go +++ b/framework/h/render_test.go @@ -25,7 +25,6 @@ func TestRender(t *testing.T) { Attribute("data-attr-2", "value"), Attributes(&AttributeMap{ "data-attr-3": "value", - "data-attr-4": "value", }), HxBeforeRequest( SetText("before request"), @@ -41,7 +40,7 @@ func TestRender(t *testing.T) { div.attributes.Set("data-attr-1", "value") - expected := `
hello, world
hello, child
` + expected := `
hello, world
hello, child
` result := Render(div) assert.Equal(t, From 9258f3ed06e25f1770b9c2e5ed914bc5aa847307 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 4 Oct 2024 10:33:04 -0500 Subject: [PATCH 28/28] fixes --- cli/htmgo/internal/dirutil/dir.go | 2 +- cli/htmgo/tasks/astgen/entry.go | 2 +- cli/htmgo/tasks/astgen/map.go | 4 ++-- framework/internal/datastructure/map.go | 4 ++-- htmgo-site/internal/datastructures/map.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cli/htmgo/internal/dirutil/dir.go b/cli/htmgo/internal/dirutil/dir.go index 6817ac9..2715277 100644 --- a/cli/htmgo/internal/dirutil/dir.go +++ b/cli/htmgo/internal/dirutil/dir.go @@ -71,7 +71,7 @@ func MoveFile(src, dst string) error { if err != nil { return fmt.Errorf("failed to copy file: %v", err) } - // Disconnect the source file. + // Remove the source file. err = os.Remove(src) if err != nil { return fmt.Errorf("failed to remove source file: %v", err) diff --git a/cli/htmgo/tasks/astgen/entry.go b/cli/htmgo/tasks/astgen/entry.go index 7b4d13b..e11ef0b 100644 --- a/cli/htmgo/tasks/astgen/entry.go +++ b/cli/htmgo/tasks/astgen/entry.go @@ -53,7 +53,7 @@ func sliceCommonPrefix(dir1, dir2 string) string { slicedDir1 := strings.TrimPrefix(dir1, commonPrefix) slicedDir2 := strings.TrimPrefix(dir2, commonPrefix) - // Disconnect leading slashes + // Remove leading slashes slicedDir1 = strings.TrimPrefix(slicedDir1, string(filepath.Separator)) slicedDir2 = strings.TrimPrefix(slicedDir2, string(filepath.Separator)) diff --git a/cli/htmgo/tasks/astgen/map.go b/cli/htmgo/tasks/astgen/map.go index 73eb3e4..201ccea 100644 --- a/cli/htmgo/tasks/astgen/map.go +++ b/cli/htmgo/tasks/astgen/map.go @@ -68,10 +68,10 @@ func (om *OrderedMap[K, V]) Values() []V { // Delete removes a key-value pair from the OrderedMap. func (om *OrderedMap[K, V]) Delete(key K) { if _, exists := om.values[key]; exists { - // Disconnect the key from the map + // Remove the key from the map delete(om.values, key) - // Disconnect the key from the keys slice + // Remove the key from the keys slice for i, k := range om.keys { if k == key { om.keys = append(om.keys[:i], om.keys[i+1:]...) diff --git a/framework/internal/datastructure/map.go b/framework/internal/datastructure/map.go index 434c561..e4741d2 100644 --- a/framework/internal/datastructure/map.go +++ b/framework/internal/datastructure/map.go @@ -70,10 +70,10 @@ func (om *OrderedMap[K, V]) Values() []V { // Delete removes a key-value pair from the OrderedMap. func (om *OrderedMap[K, V]) Delete(key K) { if _, exists := om.values[key]; exists { - // Disconnect the key from the map + // Remove the key from the map delete(om.values, key) - // Disconnect the key from the keys slice + // Remove the key from the keys slice for i, k := range om.keys { if k == key { om.keys = append(om.keys[:i], om.keys[i+1:]...) diff --git a/htmgo-site/internal/datastructures/map.go b/htmgo-site/internal/datastructures/map.go index 0e016c3..533ca4f 100644 --- a/htmgo-site/internal/datastructures/map.go +++ b/htmgo-site/internal/datastructures/map.go @@ -64,10 +64,10 @@ func (om *OrderedMap[K, V]) Values() []V { // Delete removes a key-value pair from the OrderedMap. func (om *OrderedMap[K, V]) Delete(key K) { if _, exists := om.values[key]; exists { - // Disconnect the key from the map + // Remove the key from the map delete(om.values, key) - // Disconnect the key from the keys slice + // Remove the key from the keys slice for i, k := range om.keys { if k == key { om.keys = append(om.keys[:i], om.keys[i+1:]...)