diff --git a/conway/conway_test.go b/conway/conway_test.go index 0bf5c3c..e723daa 100644 --- a/conway/conway_test.go +++ b/conway/conway_test.go @@ -1,8 +1,14 @@ package conway_test import ( + "bytes" + "encoding/base64" + "encoding/json" "fmt" + "image/png" "math/rand" + "net/http" + "regexp" "strings" "testing" ) @@ -104,7 +110,24 @@ func TestGameOfLifeCanDisplayItselfAsAString(t *testing.T) { } func TestGameOfLifeCanDisplayItselfAsAnImage(t *testing.T) { - t.Fail() + game := newTestGameOfLife() + + img, err := game.Image(1, 1) + if err != nil { + t.Error(err) + return + } + + bounds := img.Bounds() + if bounds.Max.Y < 16 { + t.Errorf("image.Max.Y < 16!: %d", bounds.Max.Y) + return + } + + if bounds.Max.X < 16 { + t.Errorf("image.Max.X < 16!: %d", bounds.Max.X) + return + } } func TestNewGameOfLifeHasCorrectDimensions(t *testing.T) { @@ -416,3 +439,128 @@ func TestGameStateCoordsAreNeverOutOfBounds(t *testing.T) { t.Errorf("(%d, %d) != %d: %d", oobX, oobY, newVal, cell.Value) } } + +type testResponseWriter struct { + Status int + Headers http.Header + Body []byte +} + +func (w *testResponseWriter) WriteHeader(status int) { + w.Status = status +} + +func (w *testResponseWriter) Header() http.Header { + return w.Headers +} + +func (w *testResponseWriter) Write(bytes []byte) (int, error) { + w.Body = append(w.Body, bytes[:]...) + return len(bytes), nil +} + +func newTestResponseWriter() *testResponseWriter { + return &testResponseWriter{ + Body: []byte(""), + Headers: make(map[string][]string), + } +} + +func TestHandleWebGameRootReturnsIndexPageForGET(t *testing.T) { + req, err := http.NewRequest("GET", "http://localhost:9775/", nil) + if err != nil { + t.Error(err) + return + } + + w := newTestResponseWriter() + HandleWebGameRoot(w, req) + + if w.Status != http.StatusOK { + t.Fail() + return + } + + matched, err := regexp.MatchString("

Conway's Game of Life

", string(w.Body)) + if err != nil { + t.Error(err) + return + } + + if !matched { + t.Fail() + return + } +} + +func TestHandleWebGameRootReturns405ForNonGET(t *testing.T) { + req, err := http.NewRequest("OPTIONS", "http://localhost:9775/", nil) + if err != nil { + t.Error(err) + return + } + + w := newTestResponseWriter() + HandleWebGameRoot(w, req) + + if w.Status != http.StatusMethodNotAllowed { + t.Fail() + return + } + + matched, err := regexp.MatchString("Nope", string(w.Body)) + if err != nil { + t.Error(err) + return + } + + if !matched { + t.Fail() + return + } +} + +func TestHandleWebGameStateForGET(t *testing.T) { + req, err := http.NewRequest("GET", "http://localhost:9775/state.png?random=1", nil) + if err != nil { + t.Error(err) + return + } + + w := newTestResponseWriter() + HandleWebGameState(w, req) + + if w.Status != http.StatusOK { + t.Errorf("status != %d: %d", http.StatusOK, w.Status) + return + } + + webState := &WebGameState{} + err = json.Unmarshal(w.Body, webState) + if err != nil { + t.Error(err) + return + } + + imgB64 := []byte(webState.Img) + imgBytes := make([]byte, len(imgB64)) + + _, err = base64.StdEncoding.Decode(imgBytes, imgB64) + if err != nil { + t.Error(err) + return + } + + img, err := png.Decode(bytes.NewBuffer(imgBytes)) + if err != nil { + t.Error(err) + return + } + + bounds := img.Bounds() + + if bounds.Max.Y < 80 || bounds.Max.X < 80 { + t.Errorf("Image has incorrect bounds: %+v", bounds) + return + } +} diff --git a/conway/conways-game-of-life/main.go b/conway/conways-game-of-life/main.go index 8aef411..f099de6 100644 --- a/conway/conways-game-of-life/main.go +++ b/conway/conways-game-of-life/main.go @@ -11,10 +11,12 @@ import ( ) var ( - height = flag.Int("height", 40, "Game height") - width = flag.Int("width", 80, "Game width") - mutate = flag.Bool("mutate", false, "Mutate every other generation") - web = flag.Bool("web", false, "Run server for web-based game") + height = flag.Int("height", 40, "Game height") + width = flag.Int("width", 80, "Game width") + mutate = flag.Bool("mutate", false, "Mutate every other generation") + web = flag.Bool("web", false, "Run a web-based game.") + addr = flag.String("addr", ":9775", + "Address for server of web-based game (ignored if running a console game.)") sleepMs = flag.Int("sleep.ms", 200, "Millisecond sleep interval per generation") ) @@ -28,7 +30,7 @@ func main() { ) if *web { - retCode, err = RunWebGame(*height, *width, *sleepMs, *mutate) + retCode, err = RunWebGame(*addr, *height, *width, *sleepMs, *mutate) if err != nil { fmt.Fprintf(os.Stderr, "ERROR: %v\n", err) } diff --git a/conway/game_of_life.go b/conway/game_of_life.go index b6acbe8..1a5ff6e 100644 --- a/conway/game_of_life.go +++ b/conway/game_of_life.go @@ -102,7 +102,7 @@ func (game *GameOfLife) String() string { return fmt.Sprintf("%s\n", game.State) } -func (game *GameOfLife) Image(xMult, yMult int) (*image.Gray16, error) { +func (game *GameOfLife) Image(xMult, yMult int) (*image.Gray, error) { return game.State.Image(xMult, yMult) } diff --git a/conway/game_state.go b/conway/game_state.go index 5d86872..f34667f 100644 --- a/conway/game_state.go +++ b/conway/game_state.go @@ -5,6 +5,8 @@ import ( "errors" "fmt" "image" + "image/color" + "image/draw" "math" "math/rand" "strings" @@ -16,18 +18,18 @@ const ( ) type GameStateCell struct { - Value int - X int - Y int + Value int `json:"value"` + X int `json:"x"` + Y int `json:"y"` } type GameStateRow struct { - Y int - Cells []*GameStateCell + Y int `json:"y"` + Cells []*GameStateCell `json:"cells"` } type GameState struct { - Rows []*GameStateRow + Rows []*GameStateRow `json:"rows"` } func NewGameState(height, width int) *GameState { @@ -175,6 +177,29 @@ func (state *GameState) String() string { return strings.Join(rows, "\n") } -func (state *GameState) Image(xMult, yMult int) (*image.Gray16, error) { - return nil, errors.New("Not implemented!") +func (state *GameState) Image(xMult, yMult int) (*image.Gray, error) { + img := image.NewGray(image.Rect(0, 0, state.Height()*xMult, state.Width()*yMult)) + draw.Draw(img, img.Bounds(), &image.Uniform{color.Gray16{0xff}}, + image.ZP, draw.Src) + + cells, err := state.Cells() + if err != nil { + return nil, err + } + + black := &image.Uniform{color.Black} + white := &image.Uniform{color.White} + + for cell := range cells { + color := white + if cell.Value == 1 { + color = black + } + + square := image.Rect(cell.X*xMult, cell.Y*yMult, + (cell.X*xMult)+xMult, (cell.Y*yMult)+yMult) + draw.Draw(img, square, color, image.ZP, draw.Src) + } + + return img, nil } diff --git a/conway/web.go b/conway/web.go index a08cb7d..c97e730 100644 --- a/conway/web.go +++ b/conway/web.go @@ -1,14 +1,215 @@ package conway import ( + "bytes" + "encoding/base64" + "encoding/json" + "fmt" + "image/png" + "log" "math/rand" + "net/http" + "net/url" + "strconv" "time" ) -func init() { - rand.Seed(time.Now().UTC().UnixNano()) +type WebGameParams struct { + Random bool + Height int + Width int + Xmul int + Ymul int } -func RunWebGame(height, width, sleepMs int, mutate bool) (int, error) { - return -1, nil +type WebGameState struct { + State *GameState `json:"state"` + Img string `json:"img"` +} + +var jQueryMinJs = []byte("") + +func init() { + rand.Seed(time.Now().UTC().UnixNano()) + jqmin, err := base64.StdEncoding.DecodeString(JQUERY_MIN_JS) + if err != nil { + log.Fatal("Failed to decode internal jquery.min.js") + } + jQueryMinJs = append(jQueryMinJs, jqmin...) +} + +func NewWebGameParams(q url.Values) *WebGameParams { + params := &WebGameParams{ + Height: 50, + Width: 50, + Xmul: 10, + Ymul: 10, + } + + if len(q.Get("random")) > 0 { + params.Random = true + } + + h := q.Get("h") + if len(h) > 0 { + if i, err := strconv.Atoi(h); err == nil { + params.Height = i + } + } + + w := q.Get("w") + if len(w) > 0 { + if i, err := strconv.Atoi(w); err == nil { + params.Width = i + } + } + + xm := q.Get("xm") + if len(xm) > 0 { + if i, err := strconv.Atoi(xm); err == nil { + params.Xmul = i + } + } + + ym := q.Get("ym") + if len(ym) > 0 { + if i, err := strconv.Atoi(ym); err == nil { + params.Ymul = i + } + } + + return params +} + +func handle405(method, uri string, w http.ResponseWriter) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusMethodNotAllowed) + w.Write([]byte(fmt.Sprintf("Nope. %v not allowed at %v\n", method, uri))) +} + +func handle500(err error, w http.ResponseWriter) { + log.Println("ERROR:", err) + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("We exploded!: %v\n", err))) +} + +func HandleWebGameRoot(w http.ResponseWriter, req *http.Request) { + if req.Method != "GET" { + handle405(req.Method, req.RequestURI, w) + return + } + + w.Header().Set("Content-Type", "text/html") + w.WriteHeader(http.StatusOK) + w.Write([]byte(GAME_OF_LIFE_INDEX_HTML)) + return +} + +func HandleWebGameStatic(w http.ResponseWriter, req *http.Request) { + if req.Method != "GET" { + handle405(req.Method, req.RequestURI, w) + return + } + + if req.URL.Path == "/static/normalize.css" { + w.Header().Set("Content-Type", "text/css") + w.WriteHeader(http.StatusOK) + w.Write([]byte(NORMALIZE_CSS)) + return + } + + if req.URL.Path == "/static/jquery.min.js" { + w.Header().Set("Content-Type", "text/javascript") + w.WriteHeader(http.StatusOK) + w.Write(jQueryMinJs) + return + } + + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusNotFound) + w.Write([]byte(fmt.Sprintf("Don't have: %v\n", req.URL.Path))) +} + +func HandleWebGameState(w http.ResponseWriter, req *http.Request) { + if req.Method != "GET" { + handle405(req.Method, req.RequestURI, w) + return + } + + q := req.URL.Query() + params := NewWebGameParams(q) + + if params.Random { + game := NewGameOfLife(params.Height, params.Width) + err := game.ImportRandomState() + if err != nil { + handle500(err, w) + return + } + + img, err := game.Image(params.Xmul, params.Ymul) + + if err != nil { + handle500(err, w) + return + } + + log.Println("Serving random state image.") + + var pngBuf bytes.Buffer + err = png.Encode(&pngBuf, img) + if err != nil { + handle500(err, w) + } + + imgB64 := base64.StdEncoding.EncodeToString(pngBuf.Bytes()) + webGameState := &WebGameState{State: game.State, Img: imgB64} + wgsJson, err := json.Marshal(webGameState) + + if err != nil { + handle500(err, w) + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(wgsJson) + + return + } + + rawState := q.Get("s") + if len(rawState) < 1 { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte("Missing query param \"s\".\n")) + return + } + + //state := &GameState{} + //err := json.Unmarshal([]byte(rawState), state) + //if err != nil { + //w.Header().Set("Content-Type", "text/plain") + //w.WriteHeader(http.StatusBadRequest) + //w.Write([]byte(fmt.Sprintf("Invalid query param \"s\": %v\n", err))) + //return + //} + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"state":null,"img":""}`)) + return +} + +func RunWebGame(address string, height, width, sleepMs int, mutate bool) (int, error) { + http.HandleFunc("/", HandleWebGameRoot) + http.HandleFunc("/state", HandleWebGameState) + http.HandleFunc("/static/", HandleWebGameStatic) + + fmt.Printf("Serving on %v\n", address) + err := http.ListenAndServe(address, nil) + if err != nil { + return 1, err + } + return 0, nil } diff --git a/conway/web_assets.go b/conway/web_assets.go new file mode 100644 index 0000000..b43e6d3 --- /dev/null +++ b/conway/web_assets.go @@ -0,0 +1,1849 @@ +package conway + +const ( + GAME_OF_LIFE_INDEX_HTML = ` + + + + Conway's Game of Life + + + + + +

Conway's Game of Life

+
+ +
+
+
+
+ + +` + NORMALIZE_CSS = ` +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section, +summary { + display: block; +} +audio, +canvas, +video { + display: inline-block; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden] { + display: none; +} +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +a:focus { + outline: thin dotted; +} +a:active, +a:hover { + outline: 0; +} +h1 { + font-size: 2em; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +mark { + background: #ff0; + color: #000; +} +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 0; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +button, +input, +select, +textarea { + font-family: inherit; + font-size: 100%; + margin: 0; +} +button, +input { + line-height: normal; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +input[disabled] { + cursor: default; +} +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +textarea { + overflow: auto; + vertical-align: top; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +` + JQUERY_MIN_JS = ` +LyohIGpRdWVyeSB2MS44LjMganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLw0KKGZ1 +bmN0aW9uKGUsdCl7ZnVuY3Rpb24gXyhlKXt2YXIgdD1NW2VdPXt9O3JldHVybiB2LmVhY2goZS5z +cGxpdCh5KSxmdW5jdGlvbihlLG4pe3Rbbl09ITB9KSx0fWZ1bmN0aW9uIEgoZSxuLHIpe2lmKHI9 +PT10JiZlLm5vZGVUeXBlPT09MSl7dmFyIGk9ImRhdGEtIituLnJlcGxhY2UoUCwiLSQxIikudG9M +b3dlckNhc2UoKTtyPWUuZ2V0QXR0cmlidXRlKGkpO2lmKHR5cGVvZiByPT0ic3RyaW5nIil7dHJ5 +e3I9cj09PSJ0cnVlIj8hMDpyPT09ImZhbHNlIj8hMTpyPT09Im51bGwiP251bGw6K3IrIiI9PT1y +PytyOkQudGVzdChyKT92LnBhcnNlSlNPTihyKTpyfWNhdGNoKHMpe312LmRhdGEoZSxuLHIpfWVs +c2Ugcj10fXJldHVybiByfWZ1bmN0aW9uIEIoZSl7dmFyIHQ7Zm9yKHQgaW4gZSl7aWYodD09PSJk +YXRhIiYmdi5pc0VtcHR5T2JqZWN0KGVbdF0pKWNvbnRpbnVlO2lmKHQhPT0idG9KU09OIilyZXR1 +cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBldCgpe3JldHVybiExfWZ1bmN0aW9uIHR0KCl7cmV0dXJu +ITB9ZnVuY3Rpb24gdXQoZSl7cmV0dXJuIWV8fCFlLnBhcmVudE5vZGV8fGUucGFyZW50Tm9kZS5u +b2RlVHlwZT09PTExfWZ1bmN0aW9uIGF0KGUsdCl7ZG8gZT1lW3RdO3doaWxlKGUmJmUubm9kZVR5 +cGUhPT0xKTtyZXR1cm4gZX1mdW5jdGlvbiBmdChlLHQsbil7dD10fHwwO2lmKHYuaXNGdW5jdGlv +bih0KSlyZXR1cm4gdi5ncmVwKGUsZnVuY3Rpb24oZSxyKXt2YXIgaT0hIXQuY2FsbChlLHIsZSk7 +cmV0dXJuIGk9PT1ufSk7aWYodC5ub2RlVHlwZSlyZXR1cm4gdi5ncmVwKGUsZnVuY3Rpb24oZSxy +KXtyZXR1cm4gZT09PXQ9PT1ufSk7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt2YXIgcj12LmdyZXAo +ZSxmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlVHlwZT09PTF9KTtpZihpdC50ZXN0KHQpKXJldHVy +biB2LmZpbHRlcih0LHIsIW4pO3Q9di5maWx0ZXIodCxyKX1yZXR1cm4gdi5ncmVwKGUsZnVuY3Rp +b24oZSxyKXtyZXR1cm4gdi5pbkFycmF5KGUsdCk+PTA9PT1ufSl9ZnVuY3Rpb24gbHQoZSl7dmFy +IHQ9Y3Quc3BsaXQoInwiKSxuPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKG4uY3JlYXRl +RWxlbWVudCl3aGlsZSh0Lmxlbmd0aCluLmNyZWF0ZUVsZW1lbnQodC5wb3AoKSk7cmV0dXJuIG59 +ZnVuY3Rpb24gTHQoZSx0KXtyZXR1cm4gZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXXx8ZS5h +cHBlbmRDaGlsZChlLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KSl9ZnVuY3Rpb24gQXQo +ZSx0KXtpZih0Lm5vZGVUeXBlIT09MXx8IXYuaGFzRGF0YShlKSlyZXR1cm47dmFyIG4scixpLHM9 +di5fZGF0YShlKSxvPXYuX2RhdGEodCxzKSx1PXMuZXZlbnRzO2lmKHUpe2RlbGV0ZSBvLmhhbmRs +ZSxvLmV2ZW50cz17fTtmb3IobiBpbiB1KWZvcihyPTAsaT11W25dLmxlbmd0aDtyPGk7cisrKXYu +ZXZlbnQuYWRkKHQsbix1W25dW3JdKX1vLmRhdGEmJihvLmRhdGE9di5leHRlbmQoe30sby5kYXRh +KSl9ZnVuY3Rpb24gT3QoZSx0KXt2YXIgbjtpZih0Lm5vZGVUeXBlIT09MSlyZXR1cm47dC5jbGVh +ckF0dHJpYnV0ZXMmJnQuY2xlYXJBdHRyaWJ1dGVzKCksdC5tZXJnZUF0dHJpYnV0ZXMmJnQubWVy +Z2VBdHRyaWJ1dGVzKGUpLG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG49PT0ib2JqZWN0Ij8o +dC5wYXJlbnROb2RlJiYodC5vdXRlckhUTUw9ZS5vdXRlckhUTUwpLHYuc3VwcG9ydC5odG1sNUNs +b25lJiZlLmlubmVySFRNTCYmIXYudHJpbSh0LmlubmVySFRNTCkmJih0LmlubmVySFRNTD1lLmlu +bmVySFRNTCkpOm49PT0iaW5wdXQiJiZFdC50ZXN0KGUudHlwZSk/KHQuZGVmYXVsdENoZWNrZWQ9 +dC5jaGVja2VkPWUuY2hlY2tlZCx0LnZhbHVlIT09ZS52YWx1ZSYmKHQudmFsdWU9ZS52YWx1ZSkp +Om49PT0ib3B0aW9uIj90LnNlbGVjdGVkPWUuZGVmYXVsdFNlbGVjdGVkOm49PT0iaW5wdXQifHxu +PT09InRleHRhcmVhIj90LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZTpuPT09InNjcmlwdCIm +JnQudGV4dCE9PWUudGV4dCYmKHQudGV4dD1lLnRleHQpLHQucmVtb3ZlQXR0cmlidXRlKHYuZXhw +YW5kbyl9ZnVuY3Rpb24gTXQoZSl7cmV0dXJuIHR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1l +IT0idW5kZWZpbmVkIj9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6dHlwZW9mIGUucXVlcnlT +ZWxlY3RvckFsbCE9InVuZGVmaW5lZCI/ZS5xdWVyeVNlbGVjdG9yQWxsKCIqIik6W119ZnVuY3Rp +b24gX3QoZSl7RXQudGVzdChlLnR5cGUpJiYoZS5kZWZhdWx0Q2hlY2tlZD1lLmNoZWNrZWQpfWZ1 +bmN0aW9uIFF0KGUsdCl7aWYodCBpbiBlKXJldHVybiB0O3ZhciBuPXQuY2hhckF0KDApLnRvVXBw +ZXJDYXNlKCkrdC5zbGljZSgxKSxyPXQsaT1KdC5sZW5ndGg7d2hpbGUoaS0tKXt0PUp0W2ldK247 +aWYodCBpbiBlKXJldHVybiB0fXJldHVybiByfWZ1bmN0aW9uIEd0KGUsdCl7cmV0dXJuIGU9dHx8 +ZSx2LmNzcyhlLCJkaXNwbGF5Iik9PT0ibm9uZSJ8fCF2LmNvbnRhaW5zKGUub3duZXJEb2N1bWVu +dCxlKX1mdW5jdGlvbiBZdChlLHQpe3ZhciBuLHIsaT1bXSxzPTAsbz1lLmxlbmd0aDtmb3IoO3M8 +bztzKyspe249ZVtzXTtpZighbi5zdHlsZSljb250aW51ZTtpW3NdPXYuX2RhdGEobiwib2xkZGlz +cGxheSIpLHQ/KCFpW3NdJiZuLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSImJihuLnN0eWxlLmRpc3Bs +YXk9IiIpLG4uc3R5bGUuZGlzcGxheT09PSIiJiZHdChuKSYmKGlbc109di5fZGF0YShuLCJvbGRk +aXNwbGF5IixubihuLm5vZGVOYW1lKSkpKToocj1EdChuLCJkaXNwbGF5IiksIWlbc10mJnIhPT0i +bm9uZSImJnYuX2RhdGEobiwib2xkZGlzcGxheSIscikpfWZvcihzPTA7czxvO3MrKyl7bj1lW3Nd +O2lmKCFuLnN0eWxlKWNvbnRpbnVlO2lmKCF0fHxuLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSJ8fG4u +c3R5bGUuZGlzcGxheT09PSIiKW4uc3R5bGUuZGlzcGxheT10P2lbc118fCIiOiJub25lIn1yZXR1 +cm4gZX1mdW5jdGlvbiBadChlLHQsbil7dmFyIHI9UnQuZXhlYyh0KTtyZXR1cm4gcj9NYXRoLm1h +eCgwLHJbMV0tKG58fDApKSsoclsyXXx8InB4Iik6dH1mdW5jdGlvbiBlbihlLHQsbixyKXt2YXIg +aT1uPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKT80OnQ9PT0id2lkdGgiPzE6MCxzPTA7Zm9yKDtp +PDQ7aSs9MiluPT09Im1hcmdpbiImJihzKz12LmNzcyhlLG4rJHRbaV0sITApKSxyPyhuPT09ImNv +bnRlbnQiJiYocy09cGFyc2VGbG9hdChEdChlLCJwYWRkaW5nIiskdFtpXSkpfHwwKSxuIT09Im1h +cmdpbiImJihzLT1wYXJzZUZsb2F0KER0KGUsImJvcmRlciIrJHRbaV0rIldpZHRoIikpfHwwKSk6 +KHMrPXBhcnNlRmxvYXQoRHQoZSwicGFkZGluZyIrJHRbaV0pKXx8MCxuIT09InBhZGRpbmciJiYo +cys9cGFyc2VGbG9hdChEdChlLCJib3JkZXIiKyR0W2ldKyJXaWR0aCIpKXx8MCkpO3JldHVybiBz +fWZ1bmN0aW9uIHRuKGUsdCxuKXt2YXIgcj10PT09IndpZHRoIj9lLm9mZnNldFdpZHRoOmUub2Zm +c2V0SGVpZ2h0LGk9ITAscz12LnN1cHBvcnQuYm94U2l6aW5nJiZ2LmNzcyhlLCJib3hTaXppbmci +KT09PSJib3JkZXItYm94IjtpZihyPD0wfHxyPT1udWxsKXtyPUR0KGUsdCk7aWYocjwwfHxyPT1u +dWxsKXI9ZS5zdHlsZVt0XTtpZihVdC50ZXN0KHIpKXJldHVybiByO2k9cyYmKHYuc3VwcG9ydC5i +b3hTaXppbmdSZWxpYWJsZXx8cj09PWUuc3R5bGVbdF0pLHI9cGFyc2VGbG9hdChyKXx8MH1yZXR1 +cm4gcitlbihlLHQsbnx8KHM/ImJvcmRlciI6ImNvbnRlbnQiKSxpKSsicHgifWZ1bmN0aW9uIG5u +KGUpe2lmKFd0W2VdKXJldHVybiBXdFtlXTt2YXIgdD12KCI8IitlKyI+IikuYXBwZW5kVG8oaS5i +b2R5KSxuPXQuY3NzKCJkaXNwbGF5Iik7dC5yZW1vdmUoKTtpZihuPT09Im5vbmUifHxuPT09IiIp +e1B0PWkuYm9keS5hcHBlbmRDaGlsZChQdHx8di5leHRlbmQoaS5jcmVhdGVFbGVtZW50KCJpZnJh +bWUiKSx7ZnJhbWVCb3JkZXI6MCx3aWR0aDowLGhlaWdodDowfSkpO2lmKCFIdHx8IVB0LmNyZWF0 +ZUVsZW1lbnQpSHQ9KFB0LmNvbnRlbnRXaW5kb3d8fFB0LmNvbnRlbnREb2N1bWVudCkuZG9jdW1l +bnQsSHQud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpLEh0LmNsb3NlKCk7dD1I +dC5ib2R5LmFwcGVuZENoaWxkKEh0LmNyZWF0ZUVsZW1lbnQoZSkpLG49RHQodCwiZGlzcGxheSIp +LGkuYm9keS5yZW1vdmVDaGlsZChQdCl9cmV0dXJuIFd0W2VdPW4sbn1mdW5jdGlvbiBmbihlLHQs +bixyKXt2YXIgaTtpZih2LmlzQXJyYXkodCkpdi5lYWNoKHQsZnVuY3Rpb24odCxpKXtufHxzbi50 +ZXN0KGUpP3IoZSxpKTpmbihlKyJbIisodHlwZW9mIGk9PSJvYmplY3QiP3Q6IiIpKyJdIixpLG4s +cil9KTtlbHNlIGlmKCFuJiZ2LnR5cGUodCk9PT0ib2JqZWN0Iilmb3IoaSBpbiB0KWZuKGUrIlsi +K2krIl0iLHRbaV0sbixyKTtlbHNlIHIoZSx0KX1mdW5jdGlvbiBDbihlKXtyZXR1cm4gZnVuY3Rp +b24odCxuKXt0eXBlb2YgdCE9InN0cmluZyImJihuPXQsdD0iKiIpO3ZhciByLGkscyxvPXQudG9M +b3dlckNhc2UoKS5zcGxpdCh5KSx1PTAsYT1vLmxlbmd0aDtpZih2LmlzRnVuY3Rpb24obikpZm9y +KDt1PGE7dSsrKXI9b1t1XSxzPS9eXCsvLnRlc3QocikscyYmKHI9ci5zdWJzdHIoMSl8fCIqIiks +aT1lW3JdPWVbcl18fFtdLGlbcz8idW5zaGlmdCI6InB1c2giXShuKX19ZnVuY3Rpb24ga24oZSxu +LHIsaSxzLG8pe3M9c3x8bi5kYXRhVHlwZXNbMF0sbz1vfHx7fSxvW3NdPSEwO3ZhciB1LGE9ZVtz +XSxmPTAsbD1hP2EubGVuZ3RoOjAsYz1lPT09U247Zm9yKDtmPGwmJihjfHwhdSk7ZisrKXU9YVtm +XShuLHIsaSksdHlwZW9mIHU9PSJzdHJpbmciJiYoIWN8fG9bdV0/dT10OihuLmRhdGFUeXBlcy51 +bnNoaWZ0KHUpLHU9a24oZSxuLHIsaSx1LG8pKSk7cmV0dXJuKGN8fCF1KSYmIW9bIioiXSYmKHU9 +a24oZSxuLHIsaSwiKiIsbykpLHV9ZnVuY3Rpb24gTG4oZSxuKXt2YXIgcixpLHM9di5hamF4U2V0 +dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihyIGluIG4pbltyXSE9PXQmJigoc1tyXT9lOml8fChp +PXt9KSlbcl09bltyXSk7aSYmdi5leHRlbmQoITAsZSxpKX1mdW5jdGlvbiBBbihlLG4scil7dmFy +IGkscyxvLHUsYT1lLmNvbnRlbnRzLGY9ZS5kYXRhVHlwZXMsbD1lLnJlc3BvbnNlRmllbGRzO2Zv +cihzIGluIGwpcyBpbiByJiYobltsW3NdXT1yW3NdKTt3aGlsZShmWzBdPT09IioiKWYuc2hpZnQo +KSxpPT09dCYmKGk9ZS5taW1lVHlwZXx8bi5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBl +IikpO2lmKGkpZm9yKHMgaW4gYSlpZihhW3NdJiZhW3NdLnRlc3QoaSkpe2YudW5zaGlmdChzKTti +cmVha31pZihmWzBdaW4gcilvPWZbMF07ZWxzZXtmb3IocyBpbiByKXtpZighZlswXXx8ZS5jb252 +ZXJ0ZXJzW3MrIiAiK2ZbMF1dKXtvPXM7YnJlYWt9dXx8KHU9cyl9bz1vfHx1fWlmKG8pcmV0dXJu +IG8hPT1mWzBdJiZmLnVuc2hpZnQobykscltvXX1mdW5jdGlvbiBPbihlLHQpe3ZhciBuLHIsaSxz +LG89ZS5kYXRhVHlwZXMuc2xpY2UoKSx1PW9bMF0sYT17fSxmPTA7ZS5kYXRhRmlsdGVyJiYodD1l +LmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSk7aWYob1sxXSlmb3IobiBpbiBlLmNvbnZlcnRlcnMp +YVtuLnRvTG93ZXJDYXNlKCldPWUuY29udmVydGVyc1tuXTtmb3IoO2k9b1srK2ZdOylpZihpIT09 +IioiKXtpZih1IT09IioiJiZ1IT09aSl7bj1hW3UrIiAiK2ldfHxhWyIqICIraV07aWYoIW4pZm9y +KHIgaW4gYSl7cz1yLnNwbGl0KCIgIik7aWYoc1sxXT09PWkpe249YVt1KyIgIitzWzBdXXx8YVsi +KiAiK3NbMF1dO2lmKG4pe249PT0hMD9uPWFbcl06YVtyXSE9PSEwJiYoaT1zWzBdLG8uc3BsaWNl +KGYtLSwwLGkpKTticmVha319fWlmKG4hPT0hMClpZihuJiZlWyJ0aHJvd3MiXSl0PW4odCk7ZWxz +ZSB0cnl7dD1uKHQpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOm4/ +bDoiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIraX19fXU9aX1yZXR1cm57c3RhdGU6InN1 +Y2Nlc3MiLGRhdGE6dH19ZnVuY3Rpb24gRm4oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1 +ZXN0fWNhdGNoKHQpe319ZnVuY3Rpb24gSW4oKXt0cnl7cmV0dXJuIG5ldyBlLkFjdGl2ZVhPYmpl +Y3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2godCl7fX1mdW5jdGlvbiAkbigpe3JldHVybiBz +ZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cW49dH0sMCkscW49di5ub3coKX1mdW5jdGlvbiBKbihlLHQp +e3YuZWFjaCh0LGZ1bmN0aW9uKHQsbil7dmFyIHI9KFZuW3RdfHxbXSkuY29uY2F0KFZuWyIqIl0p +LGk9MCxzPXIubGVuZ3RoO2Zvcig7aTxzO2krKylpZihyW2ldLmNhbGwoZSx0LG4pKXJldHVybn0p +fWZ1bmN0aW9uIEtuKGUsdCxuKXt2YXIgcixpPTAscz0wLG89WG4ubGVuZ3RoLHU9di5EZWZlcnJl +ZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBhLmVsZW19KSxhPWZ1bmN0aW9uKCl7dmFyIHQ9 +cW58fCRuKCksbj1NYXRoLm1heCgwLGYuc3RhcnRUaW1lK2YuZHVyYXRpb24tdCkscj1uL2YuZHVy +YXRpb258fDAsaT0xLXIscz0wLG89Zi50d2VlbnMubGVuZ3RoO2Zvcig7czxvO3MrKylmLnR3ZWVu +c1tzXS5ydW4oaSk7cmV0dXJuIHUubm90aWZ5V2l0aChlLFtmLGksbl0pLGk8MSYmbz9uOih1LnJl +c29sdmVXaXRoKGUsW2ZdKSwhMSl9LGY9dS5wcm9taXNlKHtlbGVtOmUscHJvcHM6di5leHRlbmQo +e30sdCksb3B0czp2LmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fX0sbiksb3JpZ2luYWxQcm9w +ZXJ0aWVzOnQsb3JpZ2luYWxPcHRpb25zOm4sc3RhcnRUaW1lOnFufHwkbigpLGR1cmF0aW9uOm4u +ZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT12LlR3 +ZWVuKGUsZi5vcHRzLHQsbixmLm9wdHMuc3BlY2lhbEVhc2luZ1t0XXx8Zi5vcHRzLmVhc2luZyk7 +cmV0dXJuIGYudHdlZW5zLnB1c2goaSksaX0sc3RvcDpmdW5jdGlvbih0KXt2YXIgbj0wLHI9dD9m +LnR3ZWVucy5sZW5ndGg6MDtmb3IoO248cjtuKyspZi50d2VlbnNbbl0ucnVuKDEpO3JldHVybiB0 +P3UucmVzb2x2ZVdpdGgoZSxbZix0XSk6dS5yZWplY3RXaXRoKGUsW2YsdF0pLHRoaXN9fSksbD1m +LnByb3BzO1FuKGwsZi5vcHRzLnNwZWNpYWxFYXNpbmcpO2Zvcig7aTxvO2krKyl7cj1YbltpXS5j +YWxsKGYsZSxsLGYub3B0cyk7aWYocilyZXR1cm4gcn1yZXR1cm4gSm4oZixsKSx2LmlzRnVuY3Rp +b24oZi5vcHRzLnN0YXJ0KSYmZi5vcHRzLnN0YXJ0LmNhbGwoZSxmKSx2LmZ4LnRpbWVyKHYuZXh0 +ZW5kKGEse2FuaW06ZixxdWV1ZTpmLm9wdHMucXVldWUsZWxlbTplfSkpLGYucHJvZ3Jlc3MoZi5v +cHRzLnByb2dyZXNzKS5kb25lKGYub3B0cy5kb25lLGYub3B0cy5jb21wbGV0ZSkuZmFpbChmLm9w +dHMuZmFpbCkuYWx3YXlzKGYub3B0cy5hbHdheXMpfWZ1bmN0aW9uIFFuKGUsdCl7dmFyIG4scixp +LHMsbztmb3IobiBpbiBlKXtyPXYuY2FtZWxDYXNlKG4pLGk9dFtyXSxzPWVbbl0sdi5pc0FycmF5 +KHMpJiYoaT1zWzFdLHM9ZVtuXT1zWzBdKSxuIT09ciYmKGVbcl09cyxkZWxldGUgZVtuXSksbz12 +LmNzc0hvb2tzW3JdO2lmKG8mJiJleHBhbmQiaW4gbyl7cz1vLmV4cGFuZChzKSxkZWxldGUgZVty +XTtmb3IobiBpbiBzKW4gaW4gZXx8KGVbbl09c1tuXSx0W25dPWkpfWVsc2UgdFtyXT1pfX1mdW5j +dGlvbiBHbihlLHQsbil7dmFyIHIsaSxzLG8sdSxhLGYsbCxjLGg9dGhpcyxwPWUuc3R5bGUsZD17 +fSxtPVtdLGc9ZS5ub2RlVHlwZSYmR3QoZSk7bi5xdWV1ZXx8KGw9di5fcXVldWVIb29rcyhlLCJm +eCIpLGwudW5xdWV1ZWQ9PW51bGwmJihsLnVucXVldWVkPTAsYz1sLmVtcHR5LmZpcmUsbC5lbXB0 +eS5maXJlPWZ1bmN0aW9uKCl7bC51bnF1ZXVlZHx8YygpfSksbC51bnF1ZXVlZCsrLGguYWx3YXlz +KGZ1bmN0aW9uKCl7aC5hbHdheXMoZnVuY3Rpb24oKXtsLnVucXVldWVkLS0sdi5xdWV1ZShlLCJm +eCIpLmxlbmd0aHx8bC5lbXB0eS5maXJlKCl9KX0pKSxlLm5vZGVUeXBlPT09MSYmKCJoZWlnaHQi +aW4gdHx8IndpZHRoImluIHQpJiYobi5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxw +Lm92ZXJmbG93WV0sdi5jc3MoZSwiZGlzcGxheSIpPT09ImlubGluZSImJnYuY3NzKGUsImZsb2F0 +Iik9PT0ibm9uZSImJighdi5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXR8fG5uKGUubm9k +ZU5hbWUpPT09ImlubGluZSI/cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnAuem9vbT0xKSksbi5v +dmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsdi5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3N8 +fGguZG9uZShmdW5jdGlvbigpe3Aub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxwLm92ZXJmbG93WD1u +Lm92ZXJmbG93WzFdLHAub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSk7Zm9yKHIgaW4gdCl7cz10 +W3JdO2lmKFVuLmV4ZWMocykpe2RlbGV0ZSB0W3JdLGE9YXx8cz09PSJ0b2dnbGUiO2lmKHM9PT0o +Zz8iaGlkZSI6InNob3ciKSljb250aW51ZTttLnB1c2gocil9fW89bS5sZW5ndGg7aWYobyl7dT12 +Ll9kYXRhKGUsImZ4c2hvdyIpfHx2Ll9kYXRhKGUsImZ4c2hvdyIse30pLCJoaWRkZW4iaW4gdSYm +KGc9dS5oaWRkZW4pLGEmJih1LmhpZGRlbj0hZyksZz92KGUpLnNob3coKTpoLmRvbmUoZnVuY3Rp +b24oKXt2KGUpLmhpZGUoKX0pLGguZG9uZShmdW5jdGlvbigpe3ZhciB0O3YucmVtb3ZlRGF0YShl +LCJmeHNob3ciLCEwKTtmb3IodCBpbiBkKXYuc3R5bGUoZSx0LGRbdF0pfSk7Zm9yKHI9MDtyPG87 +cisrKWk9bVtyXSxmPWguY3JlYXRlVHdlZW4oaSxnP3VbaV06MCksZFtpXT11W2ldfHx2LnN0eWxl +KGUsaSksaSBpbiB1fHwodVtpXT1mLnN0YXJ0LGcmJihmLmVuZD1mLnN0YXJ0LGYuc3RhcnQ9aT09 +PSJ3aWR0aCJ8fGk9PT0iaGVpZ2h0Ij8xOjApKX19ZnVuY3Rpb24gWW4oZSx0LG4scixpKXtyZXR1 +cm4gbmV3IFluLnByb3RvdHlwZS5pbml0KGUsdCxuLHIsaSl9ZnVuY3Rpb24gWm4oZSx0KXt2YXIg +bixyPXtoZWlnaHQ6ZX0saT0wO3Q9dD8xOjA7Zm9yKDtpPDQ7aSs9Mi10KW49JHRbaV0sclsibWFy +Z2luIituXT1yWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoci5vcGFjaXR5PXIud2lkdGg9ZSks +cn1mdW5jdGlvbiB0cihlKXtyZXR1cm4gdi5pc1dpbmRvdyhlKT9lOmUubm9kZVR5cGU9PT05P2Uu +ZGVmYXVsdFZpZXd8fGUucGFyZW50V2luZG93OiExfXZhciBuLHIsaT1lLmRvY3VtZW50LHM9ZS5s +b2NhdGlvbixvPWUubmF2aWdhdG9yLHU9ZS5qUXVlcnksYT1lLiQsZj1BcnJheS5wcm90b3R5cGUu +cHVzaCxsPUFycmF5LnByb3RvdHlwZS5zbGljZSxjPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLGg9 +T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxwPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVy +dHksZD1TdHJpbmcucHJvdG90eXBlLnRyaW0sdj1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgdi5m +bi5pbml0KGUsdCxuKX0sbT0vW1wtK10/KD86XGQqXC58KVxkKyg/OltlRV1bXC0rXT9cZCt8KS8u +c291cmNlLGc9L1xTLyx5PS9ccysvLGI9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0r +JC9nLHc9L14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLEU9L148KFx3 +KylccypcLz8+KD86PFwvXDE+fCkkLyxTPS9eW1xdLDp7fVxzXSokLyx4PS8oPzpefDp8LCkoPzpc +cypcWykrL2csVD0vXFwoPzpbIlxcXC9iZm5ydF18dVtcZGEtZkEtRl17NH0pL2csTj0vIlteIlxc +XHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZFxkKlwufClcZCsoPzpbZUVdW1wtK10/XGQr +fCkvZyxDPS9eLW1zLS8saz0vLShbXGRhLXpdKS9naSxMPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQr +IiIpLnRvVXBwZXJDYXNlKCl9LEE9ZnVuY3Rpb24oKXtpLmFkZEV2ZW50TGlzdGVuZXI/KGkucmVt +b3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQSwhMSksdi5yZWFkeSgpKTppLnJl +YWR5U3RhdGU9PT0iY29tcGxldGUiJiYoaS5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdl +IixBKSx2LnJlYWR5KCkpfSxPPXt9O3YuZm49di5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnYsaW5p +dDpmdW5jdGlvbihlLG4scil7dmFyIHMsbyx1LGE7aWYoIWUpcmV0dXJuIHRoaXM7aWYoZS5ub2Rl +VHlwZSlyZXR1cm4gdGhpcy5jb250ZXh0PXRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXM7aWYo +dHlwZW9mIGU9PSJzdHJpbmciKXtlLmNoYXJBdCgwKT09PSI8IiYmZS5jaGFyQXQoZS5sZW5ndGgt +MSk9PT0iPiImJmUubGVuZ3RoPj0zP3M9W251bGwsZSxudWxsXTpzPXcuZXhlYyhlKTtpZihzJiYo +c1sxXXx8IW4pKXtpZihzWzFdKXJldHVybiBuPW4gaW5zdGFuY2VvZiB2P25bMF06bixhPW4mJm4u +bm9kZVR5cGU/bi5vd25lckRvY3VtZW50fHxuOmksZT12LnBhcnNlSFRNTChzWzFdLGEsITApLEUu +dGVzdChzWzFdKSYmdi5pc1BsYWluT2JqZWN0KG4pJiZ0aGlzLmF0dHIuY2FsbChlLG4sITApLHYu +bWVyZ2UodGhpcyxlKTtvPWkuZ2V0RWxlbWVudEJ5SWQoc1syXSk7aWYobyYmby5wYXJlbnROb2Rl +KXtpZihvLmlkIT09c1syXSlyZXR1cm4gci5maW5kKGUpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1v +fXJldHVybiB0aGlzLmNvbnRleHQ9aSx0aGlzLnNlbGVjdG9yPWUsdGhpc31yZXR1cm4hbnx8bi5q +cXVlcnk/KG58fHIpLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3RvcihuKS5maW5kKGUpfXJldHVybiB2 +LmlzRnVuY3Rpb24oZSk/ci5yZWFkeShlKTooZS5zZWxlY3RvciE9PXQmJih0aGlzLnNlbGVjdG9y +PWUuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWUuY29udGV4dCksdi5tYWtlQXJyYXkoZSx0aGlzKSl9 +LHNlbGVjdG9yOiIiLGpxdWVyeToiMS44LjMiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1 +cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gbC5jYWxsKHRoaXMpfSxn +ZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PW51bGw/dGhpcy50b0FycmF5KCk6ZTwwP3RoaXNbdGhp +cy5sZW5ndGgrZV06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj12Lm1l +cmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gci5wcmV2T2JqZWN0PXRoaXMsci5jb250 +ZXh0PXRoaXMuY29udGV4dCx0PT09ImZpbmQiP3Iuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhp +cy5zZWxlY3Rvcj8iICI6IiIpK246dCYmKHIuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrdCsi +KCIrbisiKSIpLHJ9LGVhY2g6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdi5lYWNoKHRoaXMsZSx0KX0s +cmVhZHk6ZnVuY3Rpb24oZSl7cmV0dXJuIHYucmVhZHkucHJvbWlzZSgpLmRvbmUoZSksdGhpc30s +ZXE6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsZT09PS0xP3RoaXMuc2xpY2UoZSk6dGhpcy5zbGlj +ZShlLGUrMSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rp +b24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVz +aFN0YWNrKGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLCJzbGljZSIsbC5jYWxsKGFyZ3VtZW50cyku +am9pbigiLCIpKX0sbWFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayh2Lm1hcCh0 +aGlzLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2FsbCh0LG4sdCl9KSl9LGVuZDpmdW5jdGlvbigp +e3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6Zixz +b3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0sdi5mbi5pbml0LnByb3RvdHlwZT12LmZuLHYu +ZXh0ZW5kPXYuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsbixyLGkscyxvLHU9YXJndW1lbnRz +WzBdfHx7fSxhPTEsZj1hcmd1bWVudHMubGVuZ3RoLGw9ITE7dHlwZW9mIHU9PSJib29sZWFuIiYm +KGw9dSx1PWFyZ3VtZW50c1sxXXx8e30sYT0yKSx0eXBlb2YgdSE9Im9iamVjdCImJiF2LmlzRnVu +Y3Rpb24odSkmJih1PXt9KSxmPT09YSYmKHU9dGhpcywtLWEpO2Zvcig7YTxmO2ErKylpZigoZT1h +cmd1bWVudHNbYV0pIT1udWxsKWZvcihuIGluIGUpe3I9dVtuXSxpPWVbbl07aWYodT09PWkpY29u +dGludWU7bCYmaSYmKHYuaXNQbGFpbk9iamVjdChpKXx8KHM9di5pc0FycmF5KGkpKSk/KHM/KHM9 +ITEsbz1yJiZ2LmlzQXJyYXkocik/cjpbXSk6bz1yJiZ2LmlzUGxhaW5PYmplY3Qocik/cjp7fSx1 +W25dPXYuZXh0ZW5kKGwsbyxpKSk6aSE9PXQmJih1W25dPWkpfXJldHVybiB1fSx2LmV4dGVuZCh7 +bm9Db25mbGljdDpmdW5jdGlvbih0KXtyZXR1cm4gZS4kPT09diYmKGUuJD1hKSx0JiZlLmpRdWVy +eT09PXYmJihlLmpRdWVyeT11KSx2fSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpm +dW5jdGlvbihlKXtlP3YucmVhZHlXYWl0Kys6di5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGUp +e2lmKGU9PT0hMD8tLXYucmVhZHlXYWl0OnYuaXNSZWFkeSlyZXR1cm47aWYoIWkuYm9keSlyZXR1 +cm4gc2V0VGltZW91dCh2LnJlYWR5LDEpO3YuaXNSZWFkeT0hMDtpZihlIT09ITAmJi0tdi5yZWFk +eVdhaXQ+MClyZXR1cm47ci5yZXNvbHZlV2l0aChpLFt2XSksdi5mbi50cmlnZ2VyJiZ2KGkpLnRy +aWdnZXIoInJlYWR5Iikub2ZmKCJyZWFkeSIpfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGUpe3JldHVy +biB2LnR5cGUoZSk9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9u +KGUpe3JldHVybiB2LnR5cGUoZSk9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihlKXtyZXR1 +cm4gZSE9bnVsbCYmZT09ZS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihlKXtyZXR1cm4haXNO +YU4ocGFyc2VGbG9hdChlKSkmJmlzRmluaXRlKGUpfSx0eXBlOmZ1bmN0aW9uKGUpe3JldHVybiBl +PT1udWxsP1N0cmluZyhlKTpPW2guY2FsbChlKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1 +bmN0aW9uKGUpe2lmKCFlfHx2LnR5cGUoZSkhPT0ib2JqZWN0Inx8ZS5ub2RlVHlwZXx8di5pc1dp +bmRvdyhlKSlyZXR1cm4hMTt0cnl7aWYoZS5jb25zdHJ1Y3RvciYmIXAuY2FsbChlLCJjb25zdHJ1 +Y3RvciIpJiYhcC5jYWxsKGUuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikp +cmV0dXJuITF9Y2F0Y2gobil7cmV0dXJuITF9dmFyIHI7Zm9yKHIgaW4gZSk7cmV0dXJuIHI9PT10 +fHxwLmNhbGwoZSxyKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBl +KXJldHVybiExO3JldHVybiEwfSxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9 +LHBhcnNlSFRNTDpmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIWV8fHR5cGVvZiBlIT0ic3Ry +aW5nIj9udWxsOih0eXBlb2YgdD09ImJvb2xlYW4iJiYobj10LHQ9MCksdD10fHxpLChyPUUuZXhl +YyhlKSk/W3QuY3JlYXRlRWxlbWVudChyWzFdKV06KHI9di5idWlsZEZyYWdtZW50KFtlXSx0LG4/ +bnVsbDpbXSksdi5tZXJnZShbXSwoci5jYWNoZWFibGU/di5jbG9uZShyLmZyYWdtZW50KTpyLmZy +YWdtZW50KS5jaGlsZE5vZGVzKSkpfSxwYXJzZUpTT046ZnVuY3Rpb24odCl7aWYoIXR8fHR5cGVv +ZiB0IT0ic3RyaW5nIilyZXR1cm4gbnVsbDt0PXYudHJpbSh0KTtpZihlLkpTT04mJmUuSlNPTi5w +YXJzZSlyZXR1cm4gZS5KU09OLnBhcnNlKHQpO2lmKFMudGVzdCh0LnJlcGxhY2UoVCwiQCIpLnJl +cGxhY2UoTiwiXSIpLnJlcGxhY2UoeCwiIikpKXJldHVybihuZXcgRnVuY3Rpb24oInJldHVybiAi +K3QpKSgpO3YuZXJyb3IoIkludmFsaWQgSlNPTjogIit0KX0scGFyc2VYTUw6ZnVuY3Rpb24obil7 +dmFyIHIsaTtpZighbnx8dHlwZW9mIG4hPSJzdHJpbmciKXJldHVybiBudWxsO3RyeXtlLkRPTVBh +cnNlcj8oaT1uZXcgRE9NUGFyc2VyLHI9aS5wYXJzZUZyb21TdHJpbmcobiwidGV4dC94bWwiKSk6 +KHI9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxyLmFzeW5jPSJmYWxzZSIs +ci5sb2FkWE1MKG4pKX1jYXRjaChzKXtyPXR9cmV0dXJuKCFyfHwhci5kb2N1bWVudEVsZW1lbnR8 +fHIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmdi5lcnJvcigi +SW52YWxpZCBYTUw6ICIrbikscn0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlv +bih0KXt0JiZnLnRlc3QodCkmJihlLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKHQpe2UuZXZhbC5jYWxs +KGUsdCl9KSh0KX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoQywibXMt +IikucmVwbGFjZShrLEwpfSxub2RlTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLm5vZGVOYW1l +JiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rp +b24oZSxuLHIpe3ZhciBpLHM9MCxvPWUubGVuZ3RoLHU9bz09PXR8fHYuaXNGdW5jdGlvbihlKTtp +ZihyKXtpZih1KXtmb3IoaSBpbiBlKWlmKG4uYXBwbHkoZVtpXSxyKT09PSExKWJyZWFrfWVsc2Ug +Zm9yKDtzPG87KWlmKG4uYXBwbHkoZVtzKytdLHIpPT09ITEpYnJlYWt9ZWxzZSBpZih1KXtmb3Io +aSBpbiBlKWlmKG4uY2FsbChlW2ldLGksZVtpXSk9PT0hMSlicmVha31lbHNlIGZvcig7czxvOylp +ZihuLmNhbGwoZVtzXSxzLGVbcysrXSk9PT0hMSlicmVhaztyZXR1cm4gZX0sdHJpbTpkJiYhZC5j +YWxsKCJcdWZlZmZcdTAwYTAiKT9mdW5jdGlvbihlKXtyZXR1cm4gZT09bnVsbD8iIjpkLmNhbGwo +ZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBlPT1udWxsPyIiOihlKyIiKS5yZXBsYWNlKGIsIiIpfSxt +YWtlQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXR8fFtdO3JldHVybiBlIT1udWxsJiYobj12 +LnR5cGUoZSksZS5sZW5ndGg9PW51bGx8fG49PT0ic3RyaW5nInx8bj09PSJmdW5jdGlvbiJ8fG49 +PT0icmVnZXhwInx8di5pc1dpbmRvdyhlKT9mLmNhbGwocixlKTp2Lm1lcmdlKHIsZSkpLHJ9LGlu +QXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKHQpe2lmKGMpcmV0dXJuIGMuY2FsbCh0LGUs +bik7cj10Lmxlbmd0aCxuPW4/bjwwP01hdGgubWF4KDAscituKTpuOjA7Zm9yKDtuPHI7bisrKWlm +KG4gaW4gdCYmdFtuXT09PWUpcmV0dXJuIG59cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGUsbil7 +dmFyIHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxzPTA7aWYodHlwZW9mIHI9PSJudW1iZXIiKWZvcig7 +czxyO3MrKyllW2krK109bltzXTtlbHNlIHdoaWxlKG5bc10hPT10KWVbaSsrXT1uW3MrK107cmV0 +dXJuIGUubGVuZ3RoPWksZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1bXSxzPTAsbz1l +Lmxlbmd0aDtuPSEhbjtmb3IoO3M8bztzKyspcj0hIXQoZVtzXSxzKSxuIT09ciYmaS5wdXNoKGVb +c10pO3JldHVybiBpfSxtYXA6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLHMsbz1bXSx1PTAsYT1lLmxl +bmd0aCxmPWUgaW5zdGFuY2VvZiB2fHxhIT09dCYmdHlwZW9mIGE9PSJudW1iZXIiJiYoYT4wJiZl +WzBdJiZlW2EtMV18fGE9PT0wfHx2LmlzQXJyYXkoZSkpO2lmKGYpZm9yKDt1PGE7dSsrKWk9bihl +W3VdLHUsciksaSE9bnVsbCYmKG9bby5sZW5ndGhdPWkpO2Vsc2UgZm9yKHMgaW4gZSlpPW4oZVtz +XSxzLHIpLGkhPW51bGwmJihvW28ubGVuZ3RoXT1pKTtyZXR1cm4gby5jb25jYXQuYXBwbHkoW10s +byl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihlLG4pe3ZhciByLGkscztyZXR1cm4gdHlwZW9mIG49 +PSJzdHJpbmciJiYocj1lW25dLG49ZSxlPXIpLHYuaXNGdW5jdGlvbihlKT8oaT1sLmNhbGwoYXJn +dW1lbnRzLDIpLHM9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShuLGkuY29uY2F0KGwuY2FsbChh +cmd1bWVudHMpKSl9LHMuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHx2Lmd1aWQrKyxzKTp0fSxhY2Nlc3M6 +ZnVuY3Rpb24oZSxuLHIsaSxzLG8sdSl7dmFyIGEsZj1yPT1udWxsLGw9MCxjPWUubGVuZ3RoO2lm +KHImJnR5cGVvZiByPT0ib2JqZWN0Iil7Zm9yKGwgaW4gcil2LmFjY2VzcyhlLG4sbCxyW2xdLDEs +byxpKTtzPTF9ZWxzZSBpZihpIT09dCl7YT11PT09dCYmdi5pc0Z1bmN0aW9uKGkpLGYmJihhPyhh +PW4sbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGEuY2FsbCh2KGUpLG4pfSk6KG4uY2FsbChlLGkp +LG49bnVsbCkpO2lmKG4pZm9yKDtsPGM7bCsrKW4oZVtsXSxyLGE/aS5jYWxsKGVbbF0sbCxuKGVb +bF0scikpOmksdSk7cz0xfXJldHVybiBzP2U6Zj9uLmNhbGwoZSk6Yz9uKGVbMF0scik6b30sbm93 +OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9fSksdi5yZWFkeS5wcm9taXNl +PWZ1bmN0aW9uKHQpe2lmKCFyKXtyPXYuRGVmZXJyZWQoKTtpZihpLnJlYWR5U3RhdGU9PT0iY29t +cGxldGUiKXNldFRpbWVvdXQodi5yZWFkeSwxKTtlbHNlIGlmKGkuYWRkRXZlbnRMaXN0ZW5lcilp +LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEEsITEpLGUuYWRkRXZlbnRMaXN0 +ZW5lcigibG9hZCIsdi5yZWFkeSwhMSk7ZWxzZXtpLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVj +aGFuZ2UiLEEpLGUuYXR0YWNoRXZlbnQoIm9ubG9hZCIsdi5yZWFkeSk7dmFyIG49ITE7dHJ5e249 +ZS5mcmFtZUVsZW1lbnQ9PW51bGwmJmkuZG9jdW1lbnRFbGVtZW50fWNhdGNoKHMpe31uJiZuLmRv +U2Nyb2xsJiZmdW5jdGlvbiBvKCl7aWYoIXYuaXNSZWFkeSl7dHJ5e24uZG9TY3JvbGwoImxlZnQi +KX1jYXRjaChlKXtyZXR1cm4gc2V0VGltZW91dChvLDUwKX12LnJlYWR5KCl9fSgpfX1yZXR1cm4g +ci5wcm9taXNlKHQpfSx2LmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJh +eSBEYXRlIFJlZ0V4cCBPYmplY3QiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtPWyJbb2JqZWN0 +ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pLG49dihpKTt2YXIgTT17fTt2LkNhbGxiYWNrcz1m +dW5jdGlvbihlKXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9NW2VdfHxfKGUpOnYuZXh0ZW5kKHt9LGUp +O3ZhciBuLHIsaSxzLG8sdSxhPVtdLGY9IWUub25jZSYmW10sbD1mdW5jdGlvbih0KXtuPWUubWVt +b3J5JiZ0LHI9ITAsdT1zfHwwLHM9MCxvPWEubGVuZ3RoLGk9ITA7Zm9yKDthJiZ1PG87dSsrKWlm +KGFbdV0uYXBwbHkodFswXSx0WzFdKT09PSExJiZlLnN0b3BPbkZhbHNlKXtuPSExO2JyZWFrfWk9 +ITEsYSYmKGY/Zi5sZW5ndGgmJmwoZi5zaGlmdCgpKTpuP2E9W106Yy5kaXNhYmxlKCkpfSxjPXth +ZGQ6ZnVuY3Rpb24oKXtpZihhKXt2YXIgdD1hLmxlbmd0aDsoZnVuY3Rpb24gcih0KXt2LmVhY2go +dCxmdW5jdGlvbih0LG4pe3ZhciBpPXYudHlwZShuKTtpPT09ImZ1bmN0aW9uIj8oIWUudW5pcXVl +fHwhYy5oYXMobikpJiZhLnB1c2gobik6biYmbi5sZW5ndGgmJmkhPT0ic3RyaW5nIiYmcihuKX0p +fSkoYXJndW1lbnRzKSxpP289YS5sZW5ndGg6biYmKHM9dCxsKG4pKX1yZXR1cm4gdGhpc30scmVt +b3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGEmJnYuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2 +YXIgbjt3aGlsZSgobj12LmluQXJyYXkodCxhLG4pKT4tMSlhLnNwbGljZShuLDEpLGkmJihuPD1v +JiZvLS0sbjw9dSYmdS0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gdi5pbkFycmF5 +KGUsYSk+LTF9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGE9W10sdGhpc30sZGlzYWJsZTpmdW5j +dGlvbigpe3JldHVybiBhPWY9bj10LHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWF9 +LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZj10LG58fGMuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpm +dW5jdGlvbigpe3JldHVybiFmfSxmaXJlV2l0aDpmdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fFtd +LHQ9W2UsdC5zbGljZT90LnNsaWNlKCk6dF0sYSYmKCFyfHxmKSYmKGk/Zi5wdXNoKHQpOmwodCkp +LHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gYy5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyks +dGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXJ9fTtyZXR1cm4gY30sdi5leHRlbmQoe0Rl +ZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciB0PVtbInJlc29sdmUiLCJkb25lIix2LkNhbGxiYWNrcygi +b25jZSBtZW1vcnkiKSwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHYuQ2FsbGJhY2tzKCJv +bmNlIG1lbW9yeSIpLCJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLHYuQ2FsbGJhY2tz +KCJtZW1vcnkiKV1dLG49InBlbmRpbmciLHI9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG59LGFs +d2F5czpmdW5jdGlvbigpe3JldHVybiBpLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyks +dGhpc30sdGhlbjpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4gdi5EZWZlcnJlZChm +dW5jdGlvbihuKXt2LmVhY2godCxmdW5jdGlvbih0LHIpe3ZhciBzPXJbMF0sbz1lW3RdO2lbclsx +XV0odi5pc0Z1bmN0aW9uKG8pP2Z1bmN0aW9uKCl7dmFyIGU9by5hcHBseSh0aGlzLGFyZ3VtZW50 +cyk7ZSYmdi5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkuZG9uZShuLnJlc29sdmUp +LmZhaWwobi5yZWplY3QpLnByb2dyZXNzKG4ubm90aWZ5KTpuW3MrIldpdGgiXSh0aGlzPT09aT9u +OnRoaXMsW2VdKX06bltzXSl9KSxlPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24o +ZSl7cmV0dXJuIGUhPW51bGw/di5leHRlbmQoZSxyKTpyfX0saT17fTtyZXR1cm4gci5waXBlPXIu +dGhlbix2LmVhY2godCxmdW5jdGlvbihlLHMpe3ZhciBvPXNbMl0sdT1zWzNdO3Jbc1sxXV09by5h +ZGQsdSYmby5hZGQoZnVuY3Rpb24oKXtuPXV9LHRbZV4xXVsyXS5kaXNhYmxlLHRbMl1bMl0ubG9j +ayksaVtzWzBdXT1vLmZpcmUsaVtzWzBdKyJXaXRoIl09by5maXJlV2l0aH0pLHIucHJvbWlzZShp +KSxlJiZlLmNhbGwoaSxpKSxpfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciB0PTAsbj1sLmNhbGwoYXJn +dW1lbnRzKSxyPW4ubGVuZ3RoLGk9ciE9PTF8fGUmJnYuaXNGdW5jdGlvbihlLnByb21pc2UpP3I6 +MCxzPWk9PT0xP2U6di5EZWZlcnJlZCgpLG89ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlv +bihyKXt0W2VdPXRoaXMsbltlXT1hcmd1bWVudHMubGVuZ3RoPjE/bC5jYWxsKGFyZ3VtZW50cyk6 +cixuPT09dT9zLm5vdGlmeVdpdGgodCxuKTotLWl8fHMucmVzb2x2ZVdpdGgodCxuKX19LHUsYSxm +O2lmKHI+MSl7dT1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkociksZj1uZXcgQXJyYXkocik7Zm9y +KDt0PHI7dCsrKW5bdF0mJnYuaXNGdW5jdGlvbihuW3RdLnByb21pc2UpP25bdF0ucHJvbWlzZSgp +LmRvbmUobyh0LGYsbikpLmZhaWwocy5yZWplY3QpLnByb2dyZXNzKG8odCxhLHUpKTotLWl9cmV0 +dXJuIGl8fHMucmVzb2x2ZVdpdGgoZixuKSxzLnByb21pc2UoKX19KSx2LnN1cHBvcnQ9ZnVuY3Rp +b24oKXt2YXIgdCxuLHIscyxvLHUsYSxmLGwsYyxoLHA9aS5jcmVhdGVFbGVtZW50KCJkaXYiKTtw +LnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLHAuaW5uZXJIVE1MPSIgIDxsaW5rLz48dGFi +bGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLG49 +cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLHI9cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIp +WzBdO2lmKCFufHwhcnx8IW4ubGVuZ3RoKXJldHVybnt9O3M9aS5jcmVhdGVFbGVtZW50KCJzZWxl +Y3QiKSxvPXMuYXBwZW5kQ2hpbGQoaS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksdT1wLmdldEVs +ZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLHIuc3R5bGUuY3NzVGV4dD0idG9wOjFweDtmbG9h +dDpsZWZ0O29wYWNpdHk6LjUiLHQ9e2xlYWRpbmdXaGl0ZXNwYWNlOnAuZmlyc3RDaGlsZC5ub2Rl +VHlwZT09PTMsdGJvZHk6IXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGh0 +bWxTZXJpYWxpemU6ISFwLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxl +Oi90b3AvLnRlc3Qoci5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOnIuZ2V0 +QXR0cmlidXRlKCJocmVmIik9PT0iL2EiLG9wYWNpdHk6L14wLjUvLnRlc3Qoci5zdHlsZS5vcGFj +aXR5KSxjc3NGbG9hdDohIXIuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjp1LnZhbHVlPT09Im9uIixv +cHRTZWxlY3RlZDpvLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZTpwLmNsYXNzTmFtZSE9PSJ0Iixl +bmN0eXBlOiEhaS5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxodG1sNUNsb25lOmkuY3Jl +YXRlRWxlbWVudCgibmF2IikuY2xvbmVOb2RlKCEwKS5vdXRlckhUTUwhPT0iPDpuYXY+PC86bmF2 +PiIsYm94TW9kZWw6aS5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiLHN1Ym1pdEJ1YmJsZXM6ITAs +Y2hhbmdlQnViYmxlczohMCxmb2N1c2luQnViYmxlczohMSxkZWxldGVFeHBhbmRvOiEwLG5vQ2xv +bmVFdmVudDohMCxpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiExLHNocmlua1dyYXBCbG9ja3M6ITEs +cmVsaWFibGVNYXJnaW5SaWdodDohMCxib3hTaXppbmdSZWxpYWJsZTohMCxwaXhlbFBvc2l0aW9u +OiExfSx1LmNoZWNrZWQ9ITAsdC5ub0Nsb25lQ2hlY2tlZD11LmNsb25lTm9kZSghMCkuY2hlY2tl +ZCxzLmRpc2FibGVkPSEwLHQub3B0RGlzYWJsZWQ9IW8uZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBwLnRl +c3R9Y2F0Y2goZCl7dC5kZWxldGVFeHBhbmRvPSExfSFwLmFkZEV2ZW50TGlzdGVuZXImJnAuYXR0 +YWNoRXZlbnQmJnAuZmlyZUV2ZW50JiYocC5hdHRhY2hFdmVudCgib25jbGljayIsaD1mdW5jdGlv +bigpe3Qubm9DbG9uZUV2ZW50PSExfSkscC5jbG9uZU5vZGUoITApLmZpcmVFdmVudCgib25jbGlj +ayIpLHAuZGV0YWNoRXZlbnQoIm9uY2xpY2siLGgpKSx1PWkuY3JlYXRlRWxlbWVudCgiaW5wdXQi +KSx1LnZhbHVlPSJ0Iix1LnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksdC5yYWRpb1ZhbHVl +PXUudmFsdWU9PT0idCIsdS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksdS5zZXRB +dHRyaWJ1dGUoIm5hbWUiLCJ0IikscC5hcHBlbmRDaGlsZCh1KSxhPWkuY3JlYXRlRG9jdW1lbnRG +cmFnbWVudCgpLGEuYXBwZW5kQ2hpbGQocC5sYXN0Q2hpbGQpLHQuY2hlY2tDbG9uZT1hLmNsb25l +Tm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCx0LmFwcGVuZENoZWNrZWQ9 +dS5jaGVja2VkLGEucmVtb3ZlQ2hpbGQodSksYS5hcHBlbmRDaGlsZChwKTtpZihwLmF0dGFjaEV2 +ZW50KWZvcihsIGlue3N1Ym1pdDohMCxjaGFuZ2U6ITAsZm9jdXNpbjohMH0pZj0ib24iK2wsYz1m +IGluIHAsY3x8KHAuc2V0QXR0cmlidXRlKGYsInJldHVybjsiKSxjPXR5cGVvZiBwW2ZdPT0iZnVu +Y3Rpb24iKSx0W2wrIkJ1YmJsZXMiXT1jO3JldHVybiB2KGZ1bmN0aW9uKCl7dmFyIG4scixzLG8s +dT0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6aGlk +ZGVuOyIsYT1pLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07aWYoIWEpcmV0dXJuO249 +aS5jcmVhdGVFbGVtZW50KCJkaXYiKSxuLnN0eWxlLmNzc1RleHQ9InZpc2liaWxpdHk6aGlkZGVu +O2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246c3RhdGljO3RvcDowO21hcmdpbi10 +b3A6MXB4IixhLmluc2VydEJlZm9yZShuLGEuZmlyc3RDaGlsZCkscj1pLmNyZWF0ZUVsZW1lbnQo +ImRpdiIpLG4uYXBwZW5kQ2hpbGQociksci5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+ +PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLHM9ci5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxz +WzBdLnN0eWxlLmNzc1RleHQ9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5Om5v +bmUiLGM9c1swXS5vZmZzZXRIZWlnaHQ9PT0wLHNbMF0uc3R5bGUuZGlzcGxheT0iIixzWzFdLnN0 +eWxlLmRpc3BsYXk9Im5vbmUiLHQucmVsaWFibGVIaWRkZW5PZmZzZXRzPWMmJnNbMF0ub2Zmc2V0 +SGVpZ2h0PT09MCxyLmlubmVySFRNTD0iIixyLnN0eWxlLmNzc1RleHQ9ImJveC1zaXppbmc6Ym9y +ZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWJveC1zaXppbmc6Ym9y +ZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3BsYXk6YmxvY2s7d2lkdGg6NHB4O21h +cmdpbi10b3A6MSU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjElOyIsdC5ib3hTaXppbmc9ci5vZmZz +ZXRXaWR0aD09PTQsdC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldD1hLm9mZnNldFRv +cCE9PTEsZS5nZXRDb21wdXRlZFN0eWxlJiYodC5waXhlbFBvc2l0aW9uPShlLmdldENvbXB1dGVk +U3R5bGUocixudWxsKXx8e30pLnRvcCE9PSIxJSIsdC5ib3hTaXppbmdSZWxpYWJsZT0oZS5nZXRD +b21wdXRlZFN0eWxlKHIsbnVsbCl8fHt3aWR0aDoiNHB4In0pLndpZHRoPT09IjRweCIsbz1pLmNy +ZWF0ZUVsZW1lbnQoImRpdiIpLG8uc3R5bGUuY3NzVGV4dD1yLnN0eWxlLmNzc1RleHQ9dSxvLnN0 +eWxlLm1hcmdpblJpZ2h0PW8uc3R5bGUud2lkdGg9IjAiLHIuc3R5bGUud2lkdGg9IjFweCIsci5h +cHBlbmRDaGlsZChvKSx0LnJlbGlhYmxlTWFyZ2luUmlnaHQ9IXBhcnNlRmxvYXQoKGUuZ2V0Q29t +cHV0ZWRTdHlsZShvLG51bGwpfHx7fSkubWFyZ2luUmlnaHQpKSx0eXBlb2Ygci5zdHlsZS56b29t +IT0idW5kZWZpbmVkIiYmKHIuaW5uZXJIVE1MPSIiLHIuc3R5bGUuY3NzVGV4dD11KyJ3aWR0aDox +cHg7cGFkZGluZzoxcHg7ZGlzcGxheTppbmxpbmU7em9vbToxIix0LmlubGluZUJsb2NrTmVlZHNM +YXlvdXQ9ci5vZmZzZXRXaWR0aD09PTMsci5zdHlsZS5kaXNwbGF5PSJibG9jayIsci5zdHlsZS5v +dmVyZmxvdz0idmlzaWJsZSIsci5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IixyLmZpcnN0Q2hpbGQu +c3R5bGUud2lkdGg9IjVweCIsdC5zaHJpbmtXcmFwQmxvY2tzPXIub2Zmc2V0V2lkdGghPT0zLG4u +c3R5bGUuem9vbT0xKSxhLnJlbW92ZUNoaWxkKG4pLG49cj1zPW89bnVsbH0pLGEucmVtb3ZlQ2hp +bGQocCksbj1yPXM9bz11PWE9cD1udWxsLHR9KCk7dmFyIEQ9Lyg/Olx7W1xzXFNdKlx9fFxbW1xz +XFNdKlxdKSQvLFA9LyhbQS1aXSkvZzt2LmV4dGVuZCh7Y2FjaGU6e30sZGVsZXRlZElkczpbXSx1 +dWlkOjAsZXhwYW5kbzoialF1ZXJ5Iisodi5mbi5qcXVlcnkrTWF0aC5yYW5kb20oKSkucmVwbGFj +ZSgvXEQvZywiIiksbm9EYXRhOntlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQt +MTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsYXBwbGV0OiEwfSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3Jl +dHVybiBlPWUubm9kZVR5cGU/di5jYWNoZVtlW3YuZXhwYW5kb11dOmVbdi5leHBhbmRvXSwhIWUm +JiFCKGUpfSxkYXRhOmZ1bmN0aW9uKGUsbixyLGkpe2lmKCF2LmFjY2VwdERhdGEoZSkpcmV0dXJu +O3ZhciBzLG8sdT12LmV4cGFuZG8sYT10eXBlb2Ygbj09InN0cmluZyIsZj1lLm5vZGVUeXBlLGw9 +Zj92LmNhY2hlOmUsYz1mP2VbdV06ZVt1XSYmdTtpZigoIWN8fCFsW2NdfHwhaSYmIWxbY10uZGF0 +YSkmJmEmJnI9PT10KXJldHVybjtjfHwoZj9lW3VdPWM9di5kZWxldGVkSWRzLnBvcCgpfHx2Lmd1 +aWQrKzpjPXUpLGxbY118fChsW2NdPXt9LGZ8fChsW2NdLnRvSlNPTj12Lm5vb3ApKTtpZih0eXBl +b2Ygbj09Im9iamVjdCJ8fHR5cGVvZiBuPT0iZnVuY3Rpb24iKWk/bFtjXT12LmV4dGVuZChsW2Nd +LG4pOmxbY10uZGF0YT12LmV4dGVuZChsW2NdLmRhdGEsbik7cmV0dXJuIHM9bFtjXSxpfHwocy5k +YXRhfHwocy5kYXRhPXt9KSxzPXMuZGF0YSksciE9PXQmJihzW3YuY2FtZWxDYXNlKG4pXT1yKSxh +PyhvPXNbbl0sbz09bnVsbCYmKG89c1t2LmNhbWVsQ2FzZShuKV0pKTpvPXMsb30scmVtb3ZlRGF0 +YTpmdW5jdGlvbihlLHQsbil7aWYoIXYuYWNjZXB0RGF0YShlKSlyZXR1cm47dmFyIHIsaSxzLG89 +ZS5ub2RlVHlwZSx1PW8/di5jYWNoZTplLGE9bz9lW3YuZXhwYW5kb106di5leHBhbmRvO2lmKCF1 +W2FdKXJldHVybjtpZih0KXtyPW4/dVthXTp1W2FdLmRhdGE7aWYocil7di5pc0FycmF5KHQpfHwo +dCBpbiByP3Q9W3RdOih0PXYuY2FtZWxDYXNlKHQpLHQgaW4gcj90PVt0XTp0PXQuc3BsaXQoIiAi +KSkpO2ZvcihpPTAscz10Lmxlbmd0aDtpPHM7aSsrKWRlbGV0ZSByW3RbaV1dO2lmKCEobj9COnYu +aXNFbXB0eU9iamVjdCkocikpcmV0dXJufX1pZighbil7ZGVsZXRlIHVbYV0uZGF0YTtpZighQih1 +W2FdKSlyZXR1cm59bz92LmNsZWFuRGF0YShbZV0sITApOnYuc3VwcG9ydC5kZWxldGVFeHBhbmRv +fHx1IT11LndpbmRvdz9kZWxldGUgdVthXTp1W2FdPW51bGx9LF9kYXRhOmZ1bmN0aW9uKGUsdCxu +KXtyZXR1cm4gdi5kYXRhKGUsdCxuLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihlKXt2YXIgdD1l +Lm5vZGVOYW1lJiZ2Lm5vRGF0YVtlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO3JldHVybiF0fHx0 +IT09ITAmJmUuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT10fX0pLHYuZm4uZXh0ZW5kKHtkYXRh +OmZ1bmN0aW9uKGUsbil7dmFyIHIsaSxzLG8sdSxhPXRoaXNbMF0sZj0wLGw9bnVsbDtpZihlPT09 +dCl7aWYodGhpcy5sZW5ndGgpe2w9di5kYXRhKGEpO2lmKGEubm9kZVR5cGU9PT0xJiYhdi5fZGF0 +YShhLCJwYXJzZWRBdHRycyIpKXtzPWEuYXR0cmlidXRlcztmb3IodT1zLmxlbmd0aDtmPHU7Zisr +KW89c1tmXS5uYW1lLG8uaW5kZXhPZigiZGF0YS0iKXx8KG89di5jYW1lbENhc2Uoby5zdWJzdHJp +bmcoNSkpLEgoYSxvLGxbb10pKTt2Ll9kYXRhKGEsInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBs +fXJldHVybiB0eXBlb2YgZT09Im9iamVjdCI/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5kYXRhKHRo +aXMsZSl9KToocj1lLnNwbGl0KCIuIiwyKSxyWzFdPXJbMV0/Ii4iK3JbMV06IiIsaT1yWzFdKyIh +Iix2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKG4pe2lmKG49PT10KXJldHVybiBsPXRoaXMudHJpZ2dl +ckhhbmRsZXIoImdldERhdGEiK2ksW3JbMF1dKSxsPT09dCYmYSYmKGw9di5kYXRhKGEsZSksbD1I +KGEsZSxsKSksbD09PXQmJnJbMV0/dGhpcy5kYXRhKHJbMF0pOmw7clsxXT1uLHRoaXMuZWFjaChm +dW5jdGlvbigpe3ZhciB0PXYodGhpcyk7dC50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIraSxyKSx2 +LmRhdGEodGhpcyxlLG4pLHQudHJpZ2dlckhhbmRsZXIoImNoYW5nZURhdGEiK2kscil9KX0sbnVs +bCxuLGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCExKSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7 +cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3YucmVtb3ZlRGF0YSh0aGlzLGUpfSl9fSksdi5l +eHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZihlKXJldHVybiB0PSh0fHwiZngi +KSsicXVldWUiLHI9di5fZGF0YShlLHQpLG4mJighcnx8di5pc0FycmF5KG4pP3I9di5fZGF0YShl +LHQsdi5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24oZSx0 +KXt0PXR8fCJmeCI7dmFyIG49di5xdWV1ZShlLHQpLHI9bi5sZW5ndGgsaT1uLnNoaWZ0KCkscz12 +Ll9xdWV1ZUhvb2tzKGUsdCksbz1mdW5jdGlvbigpe3YuZGVxdWV1ZShlLHQpfTtpPT09ImlucHJv +Z3Jlc3MiJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYodD09PSJmeCImJm4udW5zaGlmdCgiaW5wcm9n +cmVzcyIpLGRlbGV0ZSBzLnN0b3AsaS5jYWxsKGUsbyxzKSksIXImJnMmJnMuZW1wdHkuZmlyZSgp +fSxfcXVldWVIb29rczpmdW5jdGlvbihlLHQpe3ZhciBuPXQrInF1ZXVlSG9va3MiO3JldHVybiB2 +Ll9kYXRhKGUsbil8fHYuX2RhdGEoZSxuLHtlbXB0eTp2LkNhbGxiYWNrcygib25jZSBtZW1vcnki +KS5hZGQoZnVuY3Rpb24oKXt2LnJlbW92ZURhdGEoZSx0KyJxdWV1ZSIsITApLHYucmVtb3ZlRGF0 +YShlLG4sITApfSl9KX19KSx2LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSxuKXt2YXIgcj0y +O3JldHVybiB0eXBlb2YgZSE9InN0cmluZyImJihuPWUsZT0iZngiLHItLSksYXJndW1lbnRzLmxl +bmd0aDxyP3YucXVldWUodGhpc1swXSxlKTpuPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigp +e3ZhciB0PXYucXVldWUodGhpcyxlLG4pO3YuX3F1ZXVlSG9va3ModGhpcyxlKSxlPT09ImZ4IiYm +dFswXSE9PSJpbnByb2dyZXNzIiYmdi5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVxdWV1ZTpmdW5jdGlv +bihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVs +YXk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT12LmZ4P3YuZnguc3BlZWRzW2VdfHxlOmUsdD10fHwi +ZngiLHRoaXMucXVldWUodCxmdW5jdGlvbih0LG4pe3ZhciByPXNldFRpbWVvdXQodCxlKTtuLnN0 +b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQocil9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7 +cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSxuKXt2YXIg +cixpPTEscz12LkRlZmVycmVkKCksbz10aGlzLHU9dGhpcy5sZW5ndGgsYT1mdW5jdGlvbigpey0t +aXx8cy5yZXNvbHZlV2l0aChvLFtvXSl9O3R5cGVvZiBlIT0ic3RyaW5nIiYmKG49ZSxlPXQpLGU9 +ZXx8ImZ4Ijt3aGlsZSh1LS0pcj12Ll9kYXRhKG9bdV0sZSsicXVldWVIb29rcyIpLHImJnIuZW1w +dHkmJihpKyssci5lbXB0eS5hZGQoYSkpO3JldHVybiBhKCkscy5wcm9taXNlKG4pfX0pO3ZhciBq +LEYsSSxxPS9bXHRcclxuXS9nLFI9L1xyL2csVT0vXig/OmJ1dHRvbnxpbnB1dCkkL2ksej0vXig/ +OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSxXPS9eYSg/OnJlYXwpJC9p +LFg9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxk +aXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3Bl +ZHxzZWxlY3RlZCkkL2ksVj12LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlO3YuZm4uZXh0ZW5kKHth +dHRyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYuYWNjZXNzKHRoaXMsdi5hdHRyLGUsdCxhcmd1bWVu +dHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVu +Y3Rpb24oKXt2LnJlbW92ZUF0dHIodGhpcyxlKX0pfSxwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJu +IHYuYWNjZXNzKHRoaXMsdi5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9w +OmZ1bmN0aW9uKGUpe3JldHVybiBlPXYucHJvcEZpeFtlXXx8ZSx0aGlzLmVhY2goZnVuY3Rpb24o +KXt0cnl7dGhpc1tlXT10LGRlbGV0ZSB0aGlzW2VdfWNhdGNoKG4pe319KX0sYWRkQ2xhc3M6ZnVu +Y3Rpb24oZSl7dmFyIHQsbixyLGkscyxvLHU7aWYodi5pc0Z1bmN0aW9uKGUpKXJldHVybiB0aGlz +LmVhY2goZnVuY3Rpb24odCl7dih0aGlzKS5hZGRDbGFzcyhlLmNhbGwodGhpcyx0LHRoaXMuY2xh +c3NOYW1lKSl9KTtpZihlJiZ0eXBlb2YgZT09InN0cmluZyIpe3Q9ZS5zcGxpdCh5KTtmb3Iobj0w +LHI9dGhpcy5sZW5ndGg7bjxyO24rKyl7aT10aGlzW25dO2lmKGkubm9kZVR5cGU9PT0xKWlmKCFp +LmNsYXNzTmFtZSYmdC5sZW5ndGg9PT0xKWkuY2xhc3NOYW1lPWU7ZWxzZXtzPSIgIitpLmNsYXNz +TmFtZSsiICI7Zm9yKG89MCx1PXQubGVuZ3RoO288dTtvKyspcy5pbmRleE9mKCIgIit0W29dKyIg +Iik8MCYmKHMrPXRbb10rIiAiKTtpLmNsYXNzTmFtZT12LnRyaW0ocyl9fX1yZXR1cm4gdGhpc30s +cmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIG4scixpLHMsbyx1LGE7aWYodi5pc0Z1bmN0aW9u +KGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7dih0aGlzKS5yZW1vdmVDbGFzcyhlLmNh +bGwodGhpcyx0LHRoaXMuY2xhc3NOYW1lKSl9KTtpZihlJiZ0eXBlb2YgZT09InN0cmluZyJ8fGU9 +PT10KXtuPShlfHwiIikuc3BsaXQoeSk7Zm9yKHU9MCxhPXRoaXMubGVuZ3RoO3U8YTt1Kyspe2k9 +dGhpc1t1XTtpZihpLm5vZGVUeXBlPT09MSYmaS5jbGFzc05hbWUpe3I9KCIgIitpLmNsYXNzTmFt +ZSsiICIpLnJlcGxhY2UocSwiICIpO2ZvcihzPTAsbz1uLmxlbmd0aDtzPG87cysrKXdoaWxlKHIu +aW5kZXhPZigiICIrbltzXSsiICIpPj0wKXI9ci5yZXBsYWNlKCIgIituW3NdKyIgIiwiICIpO2ku +Y2xhc3NOYW1lPWU/di50cmltKHIpOiIifX19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0 +aW9uKGUsdCl7dmFyIG49dHlwZW9mIGUscj10eXBlb2YgdD09ImJvb2xlYW4iO3JldHVybiB2Lmlz +RnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3YodGhpcykudG9nZ2xlQ2xhc3MoZS5j +YWxsKHRoaXMsbix0aGlzLmNsYXNzTmFtZSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe2lm +KG49PT0ic3RyaW5nIil7dmFyIGkscz0wLG89dih0aGlzKSx1PXQsYT1lLnNwbGl0KHkpO3doaWxl +KGk9YVtzKytdKXU9cj91OiFvLmhhc0NsYXNzKGkpLG9bdT8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFz +cyJdKGkpfWVsc2UgaWYobj09PSJ1bmRlZmluZWQifHxuPT09ImJvb2xlYW4iKXRoaXMuY2xhc3NO +YW1lJiZ2Ll9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNs +YXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8ZT09PSExPyIiOnYuX2RhdGEodGhpcywiX19jbGFzc05h +bWVfXyIpfHwiIn0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdD0iICIrZSsiICIsbj0wLHI9 +dGhpcy5sZW5ndGg7Zm9yKDtuPHI7bisrKWlmKHRoaXNbbl0ubm9kZVR5cGU9PT0xJiYoIiAiK3Ro +aXNbbl0uY2xhc3NOYW1lKyIgIikucmVwbGFjZShxLCIgIikuaW5kZXhPZih0KT49MClyZXR1cm4h +MDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGUpe3ZhciBuLHIsaSxzPXRoaXNbMF07aWYoIWFyZ3Vt +ZW50cy5sZW5ndGgpe2lmKHMpcmV0dXJuIG49di52YWxIb29rc1tzLnR5cGVdfHx2LnZhbEhvb2tz +W3Mubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sbiYmImdldCJpbiBuJiYocj1uLmdldChzLCJ2YWx1 +ZSIpKSE9PXQ/cjoocj1zLnZhbHVlLHR5cGVvZiByPT0ic3RyaW5nIj9yLnJlcGxhY2UoUiwiIik6 +cj09bnVsbD8iIjpyKTtyZXR1cm59cmV0dXJuIGk9di5pc0Z1bmN0aW9uKGUpLHRoaXMuZWFjaChm +dW5jdGlvbihyKXt2YXIgcyxvPXYodGhpcyk7aWYodGhpcy5ub2RlVHlwZSE9PTEpcmV0dXJuO2k/ +cz1lLmNhbGwodGhpcyxyLG8udmFsKCkpOnM9ZSxzPT1udWxsP3M9IiI6dHlwZW9mIHM9PSJudW1i +ZXIiP3MrPSIiOnYuaXNBcnJheShzKSYmKHM9di5tYXAocyxmdW5jdGlvbihlKXtyZXR1cm4gZT09 +bnVsbD8iIjplKyIifSkpLG49di52YWxIb29rc1t0aGlzLnR5cGVdfHx2LnZhbEhvb2tzW3RoaXMu +bm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoIW58fCEoInNldCJpbiBuKXx8bi5zZXQodGhpcyxz +LCJ2YWx1ZSIpPT09dCl0aGlzLnZhbHVlPXN9KX19KSx2LmV4dGVuZCh7dmFsSG9va3M6e29wdGlv +bjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hdHx8dC5z +cGVjaWZpZWQ/ZS52YWx1ZTplLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihlKXt2YXIgdCxu +LHI9ZS5vcHRpb25zLGk9ZS5zZWxlY3RlZEluZGV4LHM9ZS50eXBlPT09InNlbGVjdC1vbmUifHxp +PDAsbz1zP251bGw6W10sdT1zP2krMTpyLmxlbmd0aCxhPWk8MD91OnM/aTowO2Zvcig7YTx1O2Er +Kyl7bj1yW2FdO2lmKChuLnNlbGVjdGVkfHxhPT09aSkmJih2LnN1cHBvcnQub3B0RGlzYWJsZWQ/ +IW4uZGlzYWJsZWQ6bi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFuLnBhcmVu +dE5vZGUuZGlzYWJsZWR8fCF2Lm5vZGVOYW1lKG4ucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe3Q9 +dihuKS52YWwoKTtpZihzKXJldHVybiB0O28ucHVzaCh0KX19cmV0dXJuIG99LHNldDpmdW5jdGlv +bihlLHQpe3ZhciBuPXYubWFrZUFycmF5KHQpO3JldHVybiB2KGUpLmZpbmQoIm9wdGlvbiIpLmVh +Y2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPXYuaW5BcnJheSh2KHRoaXMpLnZhbCgpLG4pPj0w +fSksbi5sZW5ndGh8fChlLnNlbGVjdGVkSW5kZXg9LTEpLG59fX0sYXR0ckZuOnt9LGF0dHI6ZnVu +Y3Rpb24oZSxuLHIsaSl7dmFyIHMsbyx1LGE9ZS5ub2RlVHlwZTtpZighZXx8YT09PTN8fGE9PT04 +fHxhPT09MilyZXR1cm47aWYoaSYmdi5pc0Z1bmN0aW9uKHYuZm5bbl0pKXJldHVybiB2KGUpW25d +KHIpO2lmKHR5cGVvZiBlLmdldEF0dHJpYnV0ZT09InVuZGVmaW5lZCIpcmV0dXJuIHYucHJvcChl +LG4scik7dT1hIT09MXx8IXYuaXNYTUxEb2MoZSksdSYmKG49bi50b0xvd2VyQ2FzZSgpLG89di5h +dHRySG9va3Nbbl18fChYLnRlc3Qobik/RjpqKSk7aWYociE9PXQpe2lmKHI9PT1udWxsKXt2LnJl +bW92ZUF0dHIoZSxuKTtyZXR1cm59cmV0dXJuIG8mJiJzZXQiaW4gbyYmdSYmKHM9by5zZXQoZSxy +LG4pKSE9PXQ/czooZS5zZXRBdHRyaWJ1dGUobixyKyIiKSxyKX1yZXR1cm4gbyYmImdldCJpbiBv +JiZ1JiYocz1vLmdldChlLG4pKSE9PW51bGw/czoocz1lLmdldEF0dHJpYnV0ZShuKSxzPT09bnVs +bD90OnMpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMsbz0wO2lmKHQmJmUu +bm9kZVR5cGU9PT0xKXtyPXQuc3BsaXQoeSk7Zm9yKDtvPHIubGVuZ3RoO28rKylpPXJbb10saSYm +KG49di5wcm9wRml4W2ldfHxpLHM9WC50ZXN0KGkpLHN8fHYuYXR0cihlLGksIiIpLGUucmVtb3Zl +QXR0cmlidXRlKFY/aTpuKSxzJiZuIGluIGUmJihlW25dPSExKSl9fSxhdHRySG9va3M6e3R5cGU6 +e3NldDpmdW5jdGlvbihlLHQpe2lmKFUudGVzdChlLm5vZGVOYW1lKSYmZS5wYXJlbnROb2RlKXYu +ZXJyb3IoInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCIpO2Vsc2UgaWYoIXYuc3VwcG9y +dC5yYWRpb1ZhbHVlJiZ0PT09InJhZGlvIiYmdi5ub2RlTmFtZShlLCJpbnB1dCIpKXt2YXIgbj1l +LnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19 +fSx2YWx1ZTp7Z2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGomJnYubm9kZU5hbWUoZSwiYnV0dG9u +Iik/ai5nZXQoZSx0KTp0IGluIGU/ZS52YWx1ZTpudWxsfSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe2lm +KGomJnYubm9kZU5hbWUoZSwiYnV0dG9uIikpcmV0dXJuIGouc2V0KGUsdCxuKTtlLnZhbHVlPXR9 +fX0scHJvcEZpeDp7dGFiaW5kZXg6InRhYkluZGV4IixyZWFkb25seToicmVhZE9ubHkiLCJmb3Ii +OiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxs +c3BhY2luZzoiY2VsbFNwYWNpbmciLGNlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIscm93c3Bhbjoi +cm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJm +cmFtZUJvcmRlciIsY29udGVudGVkaXRhYmxlOiJjb250ZW50RWRpdGFibGUifSxwcm9wOmZ1bmN0 +aW9uKGUsbixyKXt2YXIgaSxzLG8sdT1lLm5vZGVUeXBlO2lmKCFlfHx1PT09M3x8dT09PTh8fHU9 +PT0yKXJldHVybjtyZXR1cm4gbz11IT09MXx8IXYuaXNYTUxEb2MoZSksbyYmKG49di5wcm9wRml4 +W25dfHxuLHM9di5wcm9wSG9va3Nbbl0pLHIhPT10P3MmJiJzZXQiaW4gcyYmKGk9cy5zZXQoZSxy +LG4pKSE9PXQ/aTplW25dPXI6cyYmImdldCJpbiBzJiYoaT1zLmdldChlLG4pKSE9PW51bGw/aTpl +W25dfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIG49ZS5nZXRBdHRy +aWJ1dGVOb2RlKCJ0YWJpbmRleCIpO3JldHVybiBuJiZuLnNwZWNpZmllZD9wYXJzZUludChuLnZh +bHVlLDEwKTp6LnRlc3QoZS5ub2RlTmFtZSl8fFcudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6 +dH19fX0pLEY9e2dldDpmdW5jdGlvbihlLG4pe3ZhciByLGk9di5wcm9wKGUsbik7cmV0dXJuIGk9 +PT0hMHx8dHlwZW9mIGkhPSJib29sZWFuIiYmKHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pKSYmci5u +b2RlVmFsdWUhPT0hMT9uLnRvTG93ZXJDYXNlKCk6dH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIg +cjtyZXR1cm4gdD09PSExP3YucmVtb3ZlQXR0cihlLG4pOihyPXYucHJvcEZpeFtuXXx8bixyIGlu +IGUmJihlW3JdPSEwKSxlLnNldEF0dHJpYnV0ZShuLG4udG9Mb3dlckNhc2UoKSkpLG59fSxWfHwo +ST17bmFtZTohMCxpZDohMCxjb29yZHM6ITB9LGo9di52YWxIb29rcy5idXR0b249e2dldDpmdW5j +dGlvbihlLG4pe3ZhciByO3JldHVybiByPWUuZ2V0QXR0cmlidXRlTm9kZShuKSxyJiYoSVtuXT9y +LnZhbHVlIT09IiI6ci5zcGVjaWZpZWQpP3IudmFsdWU6dH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2 +YXIgcj1lLmdldEF0dHJpYnV0ZU5vZGUobik7cmV0dXJuIHJ8fChyPWkuY3JlYXRlQXR0cmlidXRl +KG4pLGUuc2V0QXR0cmlidXRlTm9kZShyKSksci52YWx1ZT10KyIifX0sdi5lYWNoKFsid2lkdGgi +LCJoZWlnaHQiXSxmdW5jdGlvbihlLHQpe3YuYXR0ckhvb2tzW3RdPXYuZXh0ZW5kKHYuYXR0ckhv +b2tzW3RdLHtzZXQ6ZnVuY3Rpb24oZSxuKXtpZihuPT09IiIpcmV0dXJuIGUuc2V0QXR0cmlidXRl +KHQsImF1dG8iKSxufX0pfSksdi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6ai5nZXQs +c2V0OmZ1bmN0aW9uKGUsdCxuKXt0PT09IiImJih0PSJmYWxzZSIpLGouc2V0KGUsdCxuKX19KSx2 +LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fHYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhl +aWdodCJdLGZ1bmN0aW9uKGUsbil7di5hdHRySG9va3Nbbl09di5leHRlbmQodi5hdHRySG9va3Nb +bl0se2dldDpmdW5jdGlvbihlKXt2YXIgcj1lLmdldEF0dHJpYnV0ZShuLDIpO3JldHVybiByPT09 +bnVsbD90OnJ9fSl9KSx2LnN1cHBvcnQuc3R5bGV8fCh2LmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1 +bmN0aW9uKGUpe3JldHVybiBlLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8dH0sc2V0OmZ1 +bmN0aW9uKGUsdCl7cmV0dXJuIGUuc3R5bGUuY3NzVGV4dD10KyIifX0pLHYuc3VwcG9ydC5vcHRT +ZWxlY3RlZHx8KHYucHJvcEhvb2tzLnNlbGVjdGVkPXYuZXh0ZW5kKHYucHJvcEhvb2tzLnNlbGVj +dGVkLHtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYodC5zZWxl +Y3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpLG51bGx9 +fSkpLHYuc3VwcG9ydC5lbmN0eXBlfHwodi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksdi5z +dXBwb3J0LmNoZWNrT258fHYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe3Yu +dmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoInZh +bHVlIik9PT1udWxsPyJvbiI6ZS52YWx1ZX19fSksdi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJd +LGZ1bmN0aW9uKCl7di52YWxIb29rc1t0aGlzXT12LmV4dGVuZCh2LnZhbEhvb2tzW3RoaXNdLHtz +ZXQ6ZnVuY3Rpb24oZSx0KXtpZih2LmlzQXJyYXkodCkpcmV0dXJuIGUuY2hlY2tlZD12LmluQXJy +YXkodihlKS52YWwoKSx0KT49MH19KX0pO3ZhciAkPS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0 +KSQvaSxKPS9eKFteXC5dKnwpKD86XC4oLispfCkkLyxLPS8oPzpefFxzKWhvdmVyKFwuXFMrfClc +Yi8sUT0vXmtleS8sRz0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sWT0vXig/OmZvY3Vz +aW5mb2N1c3xmb2N1c291dGJsdXIpJC8sWj1mdW5jdGlvbihlKXtyZXR1cm4gdi5ldmVudC5zcGVj +aWFsLmhvdmVyP2U6ZS5yZXBsYWNlKEssIm1vdXNlZW50ZXIkMSBtb3VzZWxlYXZlJDEiKX07di5l +dmVudD17YWRkOmZ1bmN0aW9uKGUsbixyLGkscyl7dmFyIG8sdSxhLGYsbCxjLGgscCxkLG0sZztp +ZihlLm5vZGVUeXBlPT09M3x8ZS5ub2RlVHlwZT09PTh8fCFufHwhcnx8IShvPXYuX2RhdGEoZSkp +KXJldHVybjtyLmhhbmRsZXImJihkPXIscj1kLmhhbmRsZXIscz1kLnNlbGVjdG9yKSxyLmd1aWR8 +fChyLmd1aWQ9di5ndWlkKyspLGE9by5ldmVudHMsYXx8KG8uZXZlbnRzPWE9e30pLHU9by5oYW5k +bGUsdXx8KG8uaGFuZGxlPXU9ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiB2PT0idW5kZWZpbmVk +Inx8ISFlJiZ2LmV2ZW50LnRyaWdnZXJlZD09PWUudHlwZT90OnYuZXZlbnQuZGlzcGF0Y2guYXBw +bHkodS5lbGVtLGFyZ3VtZW50cyl9LHUuZWxlbT1lKSxuPXYudHJpbShaKG4pKS5zcGxpdCgiICIp +O2ZvcihmPTA7ZjxuLmxlbmd0aDtmKyspe2w9Si5leGVjKG5bZl0pfHxbXSxjPWxbMV0saD0obFsy +XXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGc9di5ldmVudC5zcGVjaWFsW2NdfHx7fSxjPShzP2cu +ZGVsZWdhdGVUeXBlOmcuYmluZFR5cGUpfHxjLGc9di5ldmVudC5zcGVjaWFsW2NdfHx7fSxwPXYu +ZXh0ZW5kKHt0eXBlOmMsb3JpZ1R5cGU6bFsxXSxkYXRhOmksaGFuZGxlcjpyLGd1aWQ6ci5ndWlk +LHNlbGVjdG9yOnMsbmVlZHNDb250ZXh0OnMmJnYuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVz +dChzKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LGQpLG09YVtjXTtpZighbSl7bT1hW2NdPVtdLG0u +ZGVsZWdhdGVDb3VudD0wO2lmKCFnLnNldHVwfHxnLnNldHVwLmNhbGwoZSxpLGgsdSk9PT0hMSll +LmFkZEV2ZW50TGlzdGVuZXI/ZS5hZGRFdmVudExpc3RlbmVyKGMsdSwhMSk6ZS5hdHRhY2hFdmVu +dCYmZS5hdHRhY2hFdmVudCgib24iK2MsdSl9Zy5hZGQmJihnLmFkZC5jYWxsKGUscCkscC5oYW5k +bGVyLmd1aWR8fChwLmhhbmRsZXIuZ3VpZD1yLmd1aWQpKSxzP20uc3BsaWNlKG0uZGVsZWdhdGVD +b3VudCsrLDAscCk6bS5wdXNoKHApLHYuZXZlbnQuZ2xvYmFsW2NdPSEwfWU9bnVsbH0sZ2xvYmFs +Ont9LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzLG8sdSxhLGYsbCxjLGgscCxkLG0s +Zz12Lmhhc0RhdGEoZSkmJnYuX2RhdGEoZSk7aWYoIWd8fCEoaD1nLmV2ZW50cykpcmV0dXJuO3Q9 +di50cmltKFoodHx8IiIpKS5zcGxpdCgiICIpO2ZvcihzPTA7czx0Lmxlbmd0aDtzKyspe289Si5l +eGVjKHRbc10pfHxbXSx1PWE9b1sxXSxmPW9bMl07aWYoIXUpe2Zvcih1IGluIGgpdi5ldmVudC5y +ZW1vdmUoZSx1K3Rbc10sbixyLCEwKTtjb250aW51ZX1wPXYuZXZlbnQuc3BlY2lhbFt1XXx8e30s +dT0ocj9wLmRlbGVnYXRlVHlwZTpwLmJpbmRUeXBlKXx8dSxkPWhbdV18fFtdLGw9ZC5sZW5ndGgs +Zj1mP25ldyBSZWdFeHAoIihefFxcLikiK2Yuc3BsaXQoIi4iKS5zb3J0KCkuam9pbigiXFwuKD86 +LipcXC58KSIpKyIoXFwufCQpIik6bnVsbDtmb3IoYz0wO2M8ZC5sZW5ndGg7YysrKW09ZFtjXSwo +aXx8YT09PW0ub3JpZ1R5cGUpJiYoIW58fG4uZ3VpZD09PW0uZ3VpZCkmJighZnx8Zi50ZXN0KG0u +bmFtZXNwYWNlKSkmJighcnx8cj09PW0uc2VsZWN0b3J8fHI9PT0iKioiJiZtLnNlbGVjdG9yKSYm +KGQuc3BsaWNlKGMtLSwxKSxtLnNlbGVjdG9yJiZkLmRlbGVnYXRlQ291bnQtLSxwLnJlbW92ZSYm +cC5yZW1vdmUuY2FsbChlLG0pKTtkLmxlbmd0aD09PTAmJmwhPT1kLmxlbmd0aCYmKCghcC50ZWFy +ZG93bnx8cC50ZWFyZG93bi5jYWxsKGUsZixnLmhhbmRsZSk9PT0hMSkmJnYucmVtb3ZlRXZlbnQo +ZSx1LGcuaGFuZGxlKSxkZWxldGUgaFt1XSl9di5pc0VtcHR5T2JqZWN0KGgpJiYoZGVsZXRlIGcu +aGFuZGxlLHYucmVtb3ZlRGF0YShlLCJldmVudHMiLCEwKSl9LGN1c3RvbUV2ZW50OntnZXREYXRh +OiEwLHNldERhdGE6ITAsY2hhbmdlRGF0YTohMH0sdHJpZ2dlcjpmdW5jdGlvbihuLHIscyxvKXtp +Zighc3x8cy5ub2RlVHlwZSE9PTMmJnMubm9kZVR5cGUhPT04KXt2YXIgdSxhLGYsbCxjLGgscCxk +LG0sZyx5PW4udHlwZXx8bixiPVtdO2lmKFkudGVzdCh5K3YuZXZlbnQudHJpZ2dlcmVkKSlyZXR1 +cm47eS5pbmRleE9mKCIhIik+PTAmJih5PXkuc2xpY2UoMCwtMSksYT0hMCkseS5pbmRleE9mKCIu +Iik+PTAmJihiPXkuc3BsaXQoIi4iKSx5PWIuc2hpZnQoKSxiLnNvcnQoKSk7aWYoKCFzfHx2LmV2 +ZW50LmN1c3RvbUV2ZW50W3ldKSYmIXYuZXZlbnQuZ2xvYmFsW3ldKXJldHVybjtuPXR5cGVvZiBu +PT0ib2JqZWN0Ij9uW3YuZXhwYW5kb10/bjpuZXcgdi5FdmVudCh5LG4pOm5ldyB2LkV2ZW50KHkp +LG4udHlwZT15LG4uaXNUcmlnZ2VyPSEwLG4uZXhjbHVzaXZlPWEsbi5uYW1lc3BhY2U9Yi5qb2lu +KCIuIiksbi5uYW1lc3BhY2VfcmU9bi5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrYi5q +b2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGg9eS5pbmRleE9mKCI6Iik8MD8i +b24iK3k6IiI7aWYoIXMpe3U9di5jYWNoZTtmb3IoZiBpbiB1KXVbZl0uZXZlbnRzJiZ1W2ZdLmV2 +ZW50c1t5XSYmdi5ldmVudC50cmlnZ2VyKG4scix1W2ZdLmhhbmRsZS5lbGVtLCEwKTtyZXR1cm59 +bi5yZXN1bHQ9dCxuLnRhcmdldHx8KG4udGFyZ2V0PXMpLHI9ciE9bnVsbD92Lm1ha2VBcnJheShy +KTpbXSxyLnVuc2hpZnQobikscD12LmV2ZW50LnNwZWNpYWxbeV18fHt9O2lmKHAudHJpZ2dlciYm +cC50cmlnZ2VyLmFwcGx5KHMscik9PT0hMSlyZXR1cm47bT1bW3MscC5iaW5kVHlwZXx8eV1dO2lm +KCFvJiYhcC5ub0J1YmJsZSYmIXYuaXNXaW5kb3cocykpe2c9cC5kZWxlZ2F0ZVR5cGV8fHksbD1Z +LnRlc3QoZyt5KT9zOnMucGFyZW50Tm9kZTtmb3IoYz1zO2w7bD1sLnBhcmVudE5vZGUpbS5wdXNo +KFtsLGddKSxjPWw7Yz09PShzLm93bmVyRG9jdW1lbnR8fGkpJiZtLnB1c2goW2MuZGVmYXVsdFZp +ZXd8fGMucGFyZW50V2luZG93fHxlLGddKX1mb3IoZj0wO2Y8bS5sZW5ndGgmJiFuLmlzUHJvcGFn +YXRpb25TdG9wcGVkKCk7ZisrKWw9bVtmXVswXSxuLnR5cGU9bVtmXVsxXSxkPSh2Ll9kYXRhKGws +ImV2ZW50cyIpfHx7fSlbbi50eXBlXSYmdi5fZGF0YShsLCJoYW5kbGUiKSxkJiZkLmFwcGx5KGws +ciksZD1oJiZsW2hdLGQmJnYuYWNjZXB0RGF0YShsKSYmZC5hcHBseSYmZC5hcHBseShsLHIpPT09 +ITEmJm4ucHJldmVudERlZmF1bHQoKTtyZXR1cm4gbi50eXBlPXksIW8mJiFuLmlzRGVmYXVsdFBy +ZXZlbnRlZCgpJiYoIXAuX2RlZmF1bHR8fHAuX2RlZmF1bHQuYXBwbHkocy5vd25lckRvY3VtZW50 +LHIpPT09ITEpJiYoeSE9PSJjbGljayJ8fCF2Lm5vZGVOYW1lKHMsImEiKSkmJnYuYWNjZXB0RGF0 +YShzKSYmaCYmc1t5XSYmKHkhPT0iZm9jdXMiJiZ5IT09ImJsdXIifHxuLnRhcmdldC5vZmZzZXRX +aWR0aCE9PTApJiYhdi5pc1dpbmRvdyhzKSYmKGM9c1toXSxjJiYoc1toXT1udWxsKSx2LmV2ZW50 +LnRyaWdnZXJlZD15LHNbeV0oKSx2LmV2ZW50LnRyaWdnZXJlZD10LGMmJihzW2hdPWMpKSxuLnJl +c3VsdH1yZXR1cm59LGRpc3BhdGNoOmZ1bmN0aW9uKG4pe249di5ldmVudC5maXgobnx8ZS5ldmVu +dCk7dmFyIHIsaSxzLG8sdSxhLGYsYyxoLHAsZD0odi5fZGF0YSh0aGlzLCJldmVudHMiKXx8e30p +W24udHlwZV18fFtdLG09ZC5kZWxlZ2F0ZUNvdW50LGc9bC5jYWxsKGFyZ3VtZW50cykseT0hbi5l +eGNsdXNpdmUmJiFuLm5hbWVzcGFjZSxiPXYuZXZlbnQuc3BlY2lhbFtuLnR5cGVdfHx7fSx3PVtd +O2dbMF09bixuLmRlbGVnYXRlVGFyZ2V0PXRoaXM7aWYoYi5wcmVEaXNwYXRjaCYmYi5wcmVEaXNw +YXRjaC5jYWxsKHRoaXMsbik9PT0hMSlyZXR1cm47aWYobSYmKCFuLmJ1dHRvbnx8bi50eXBlIT09 +ImNsaWNrIikpZm9yKHM9bi50YXJnZXQ7cyE9dGhpcztzPXMucGFyZW50Tm9kZXx8dGhpcylpZihz +LmRpc2FibGVkIT09ITB8fG4udHlwZSE9PSJjbGljayIpe3U9e30sZj1bXTtmb3Iocj0wO3I8bTty +KyspYz1kW3JdLGg9Yy5zZWxlY3Rvcix1W2hdPT09dCYmKHVbaF09Yy5uZWVkc0NvbnRleHQ/diho +LHRoaXMpLmluZGV4KHMpPj0wOnYuZmluZChoLHRoaXMsbnVsbCxbc10pLmxlbmd0aCksdVtoXSYm +Zi5wdXNoKGMpO2YubGVuZ3RoJiZ3LnB1c2goe2VsZW06cyxtYXRjaGVzOmZ9KX1kLmxlbmd0aD5t +JiZ3LnB1c2goe2VsZW06dGhpcyxtYXRjaGVzOmQuc2xpY2UobSl9KTtmb3Iocj0wO3I8dy5sZW5n +dGgmJiFuLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7cisrKXthPXdbcl0sbi5jdXJyZW50VGFyZ2V0 +PWEuZWxlbTtmb3IoaT0wO2k8YS5tYXRjaGVzLmxlbmd0aCYmIW4uaXNJbW1lZGlhdGVQcm9wYWdh +dGlvblN0b3BwZWQoKTtpKyspe2M9YS5tYXRjaGVzW2ldO2lmKHl8fCFuLm5hbWVzcGFjZSYmIWMu +bmFtZXNwYWNlfHxuLm5hbWVzcGFjZV9yZSYmbi5uYW1lc3BhY2VfcmUudGVzdChjLm5hbWVzcGFj +ZSkpbi5kYXRhPWMuZGF0YSxuLmhhbmRsZU9iaj1jLG89KCh2LmV2ZW50LnNwZWNpYWxbYy5vcmln +VHlwZV18fHt9KS5oYW5kbGV8fGMuaGFuZGxlcikuYXBwbHkoYS5lbGVtLGcpLG8hPT10JiYobi5y +ZXN1bHQ9byxvPT09ITEmJihuLnByZXZlbnREZWZhdWx0KCksbi5zdG9wUHJvcGFnYXRpb24oKSkp +fX1yZXR1cm4gYi5wb3N0RGlzcGF0Y2gmJmIucG9zdERpc3BhdGNoLmNhbGwodGhpcyxuKSxuLnJl +c3VsdH0scHJvcHM6ImF0dHJDaGFuZ2UgYXR0ck5hbWUgcmVsYXRlZE5vZGUgc3JjRWxlbWVudCBh +bHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNl +IG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hp +Y2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2Rl +IGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlLndo +aWNoPT1udWxsJiYoZS53aGljaD10LmNoYXJDb2RlIT1udWxsP3QuY2hhckNvZGU6dC5rZXlDb2Rl +KSxlfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBm +cm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRv +RWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oZSxuKXt2YXIgcixzLG8sdT1uLmJ1 +dHRvbixhPW4uZnJvbUVsZW1lbnQ7cmV0dXJuIGUucGFnZVg9PW51bGwmJm4uY2xpZW50WCE9bnVs +bCYmKHI9ZS50YXJnZXQub3duZXJEb2N1bWVudHx8aSxzPXIuZG9jdW1lbnRFbGVtZW50LG89ci5i +b2R5LGUucGFnZVg9bi5jbGllbnRYKyhzJiZzLnNjcm9sbExlZnR8fG8mJm8uc2Nyb2xsTGVmdHx8 +MCktKHMmJnMuY2xpZW50TGVmdHx8byYmby5jbGllbnRMZWZ0fHwwKSxlLnBhZ2VZPW4uY2xpZW50 +WSsocyYmcy5zY3JvbGxUb3B8fG8mJm8uc2Nyb2xsVG9wfHwwKS0ocyYmcy5jbGllbnRUb3B8fG8m +Jm8uY2xpZW50VG9wfHwwKSksIWUucmVsYXRlZFRhcmdldCYmYSYmKGUucmVsYXRlZFRhcmdldD1h +PT09ZS50YXJnZXQ/bi50b0VsZW1lbnQ6YSksIWUud2hpY2gmJnUhPT10JiYoZS53aGljaD11JjE/ +MTp1JjI/Mzp1JjQ/MjowKSxlfX0sZml4OmZ1bmN0aW9uKGUpe2lmKGVbdi5leHBhbmRvXSlyZXR1 +cm4gZTt2YXIgdCxuLHI9ZSxzPXYuZXZlbnQuZml4SG9va3NbZS50eXBlXXx8e30sbz1zLnByb3Bz +P3RoaXMucHJvcHMuY29uY2F0KHMucHJvcHMpOnRoaXMucHJvcHM7ZT12LkV2ZW50KHIpO2Zvcih0 +PW8ubGVuZ3RoO3Q7KW49b1stLXRdLGVbbl09cltuXTtyZXR1cm4gZS50YXJnZXR8fChlLnRhcmdl +dD1yLnNyY0VsZW1lbnR8fGkpLGUudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGUudGFyZ2V0PWUudGFy +Z2V0LnBhcmVudE5vZGUpLGUubWV0YUtleT0hIWUubWV0YUtleSxzLmZpbHRlcj9zLmZpbHRlcihl +LHIpOmV9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7ZGVsZWdhdGVUeXBlOiJm +b2N1c2luIn0sYmx1cjp7ZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGJlZm9yZXVubG9hZDp7c2V0 +dXA6ZnVuY3Rpb24oZSx0LG4pe3YuaXNXaW5kb3codGhpcykmJih0aGlzLm9uYmVmb3JldW5sb2Fk +PW4pfSx0ZWFyZG93bjpmdW5jdGlvbihlLHQpe3RoaXMub25iZWZvcmV1bmxvYWQ9PT10JiYodGhp +cy5vbmJlZm9yZXVubG9hZD1udWxsKX19fSxzaW11bGF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIg +aT12LmV4dGVuZChuZXcgdi5FdmVudCxuLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITAsb3JpZ2luYWxF +dmVudDp7fX0pO3I/di5ldmVudC50cmlnZ2VyKGksbnVsbCx0KTp2LmV2ZW50LmRpc3BhdGNoLmNh +bGwodCxpKSxpLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZuLnByZXZlbnREZWZhdWx0KCl9fSx2LmV2 +ZW50LmhhbmRsZT12LmV2ZW50LmRpc3BhdGNoLHYucmVtb3ZlRXZlbnQ9aS5yZW1vdmVFdmVudExp +c3RlbmVyP2Z1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZl +bnRMaXN0ZW5lcih0LG4sITEpfTpmdW5jdGlvbihlLHQsbil7dmFyIHI9Im9uIit0O2UuZGV0YWNo +RXZlbnQmJih0eXBlb2YgZVtyXT09InVuZGVmaW5lZCImJihlW3JdPW51bGwpLGUuZGV0YWNoRXZl +bnQocixuKSl9LHYuRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZighKHRoaXMgaW5zdGFuY2VvZiB2LkV2 +ZW50KSlyZXR1cm4gbmV3IHYuRXZlbnQoZSx0KTtlJiZlLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVu +dD1lLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZS5kZWZhdWx0UHJl +dmVudGVkfHxlLnJldHVyblZhbHVlPT09ITF8fGUuZ2V0UHJldmVudERlZmF1bHQmJmUuZ2V0UHJl +dmVudERlZmF1bHQoKT90dDpldCk6dGhpcy50eXBlPWUsdCYmdi5leHRlbmQodGhpcyx0KSx0aGlz +LnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8di5ub3coKSx0aGlzW3YuZXhwYW5kb109ITB9LHYu +RXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0 +UHJldmVudGVkPXR0O3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDtpZighZSlyZXR1cm47ZS5wcmV2 +ZW50RGVmYXVsdD9lLnByZXZlbnREZWZhdWx0KCk6ZS5yZXR1cm5WYWx1ZT0hMX0sc3RvcFByb3Bh +Z2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD10dDt2YXIgZT10aGlz +Lm9yaWdpbmFsRXZlbnQ7aWYoIWUpcmV0dXJuO2Uuc3RvcFByb3BhZ2F0aW9uJiZlLnN0b3BQcm9w +YWdhdGlvbigpLGUuY2FuY2VsQnViYmxlPSEwfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVu +Y3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPXR0LHRoaXMuc3RvcFBy +b3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpldCxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpl +dCxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpldH0sdi5lYWNoKHttb3VzZWVudGVyOiJt +b3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oZSx0KXt2LmV2ZW50LnNw +ZWNpYWxbZV09e2RlbGVnYXRlVHlwZTp0LGJpbmRUeXBlOnQsaGFuZGxlOmZ1bmN0aW9uKGUpe3Zh +ciBuLHI9dGhpcyxpPWUucmVsYXRlZFRhcmdldCxzPWUuaGFuZGxlT2JqLG89cy5zZWxlY3Rvcjtp +ZighaXx8aSE9PXImJiF2LmNvbnRhaW5zKHIsaSkpZS50eXBlPXMub3JpZ1R5cGUsbj1zLmhhbmRs +ZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT10O3JldHVybiBufX19KSx2LnN1cHBvcnQu +c3VibWl0QnViYmxlc3x8KHYuZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7 +aWYodi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7di5ldmVudC5hZGQodGhpcywiY2xp +Y2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IixmdW5jdGlvbihlKXt2YXIgbj1lLnRhcmdldCxy +PXYubm9kZU5hbWUobiwiaW5wdXQiKXx8di5ub2RlTmFtZShuLCJidXR0b24iKT9uLmZvcm06dDty +JiYhdi5fZGF0YShyLCJfc3VibWl0X2F0dGFjaGVkIikmJih2LmV2ZW50LmFkZChyLCJzdWJtaXQu +X3N1Ym1pdCIsZnVuY3Rpb24oZSl7ZS5fc3VibWl0X2J1YmJsZT0hMH0pLHYuX2RhdGEociwiX3N1 +Ym1pdF9hdHRhY2hlZCIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oZSl7ZS5fc3VibWl0 +X2J1YmJsZSYmKGRlbGV0ZSBlLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWUuaXNU +cmlnZ2VyJiZ2LmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxlLCEwKSl9 +LHRlYXJkb3duOmZ1bmN0aW9uKCl7aWYodi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7 +di5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSx2LnN1cHBvcnQuY2hhbmdlQnViYmxl +c3x8KHYuZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7aWYoJC50ZXN0KHRo +aXMubm9kZU5hbWUpKXtpZih0aGlzLnR5cGU9PT0iY2hlY2tib3gifHx0aGlzLnR5cGU9PT0icmFk +aW8iKXYuZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUp +e2Uub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWU9PT0iY2hlY2tlZCImJih0aGlzLl9qdXN0X2No +YW5nZWQ9ITApfSksdi5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oZSl7 +dGhpcy5fanVzdF9jaGFuZ2VkJiYhZS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEp +LHYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxlLCEwKX0pO3JldHVybiExfXYuZXZlbnQu +YWRkKHRoaXMsImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFy +Z2V0OyQudGVzdCh0Lm5vZGVOYW1lKSYmIXYuX2RhdGEodCwiX2NoYW5nZV9hdHRhY2hlZCIpJiYo +di5ldmVudC5hZGQodCwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9k +ZSYmIWUuaXNTaW11bGF0ZWQmJiFlLmlzVHJpZ2dlciYmdi5ldmVudC5zaW11bGF0ZSgiY2hhbmdl +Iix0aGlzLnBhcmVudE5vZGUsZSwhMCl9KSx2Ll9kYXRhKHQsIl9jaGFuZ2VfYXR0YWNoZWQiLCEw +KSl9KX0saGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O2lmKHRoaXMhPT10fHxlLmlz +U2ltdWxhdGVkfHxlLmlzVHJpZ2dlcnx8dC50eXBlIT09InJhZGlvIiYmdC50eXBlIT09ImNoZWNr +Ym94IilyZXR1cm4gZS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRl +YXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIHYuZXZlbnQucmVtb3ZlKHRoaXMsIi5fY2hhbmdlIiks +ISQudGVzdCh0aGlzLm5vZGVOYW1lKX19KSx2LnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fHYuZWFj +aCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj0w +LHI9ZnVuY3Rpb24oZSl7di5ldmVudC5zaW11bGF0ZSh0LGUudGFyZ2V0LHYuZXZlbnQuZml4KGUp +LCEwKX07di5ldmVudC5zcGVjaWFsW3RdPXtzZXR1cDpmdW5jdGlvbigpe24rKz09PTAmJmkuYWRk +RXZlbnRMaXN0ZW5lcihlLHIsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpey0tbj09PTAmJmkucmVt +b3ZlRXZlbnRMaXN0ZW5lcihlLHIsITApfX19KSx2LmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSxu +LHIsaSxzKXt2YXIgbyx1O2lmKHR5cGVvZiBlPT0ib2JqZWN0Iil7dHlwZW9mIG4hPSJzdHJpbmci +JiYocj1yfHxuLG49dCk7Zm9yKHUgaW4gZSl0aGlzLm9uKHUsbixyLGVbdV0scyk7cmV0dXJuIHRo +aXN9cj09bnVsbCYmaT09bnVsbD8oaT1uLHI9bj10KTppPT1udWxsJiYodHlwZW9mIG49PSJzdHJp +bmciPyhpPXIscj10KTooaT1yLHI9bixuPXQpKTtpZihpPT09ITEpaT1ldDtlbHNlIGlmKCFpKXJl +dHVybiB0aGlzO3JldHVybiBzPT09MSYmKG89aSxpPWZ1bmN0aW9uKGUpe3JldHVybiB2KCkub2Zm +KGUpLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxpLmd1aWQ9by5ndWlkfHwoby5ndWlkPXYuZ3Vp +ZCsrKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5ldmVudC5hZGQodGhpcyxlLGkscixuKX0pfSxv +bmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24oZSx0LG4sciwxKX0sb2ZmOmZ1bmN0 +aW9uKGUsbixyKXt2YXIgaSxzO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJl +dHVybiBpPWUuaGFuZGxlT2JqLHYoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGkubmFtZXNwYWNlP2ku +b3JpZ1R5cGUrIi4iK2kubmFtZXNwYWNlOmkub3JpZ1R5cGUsaS5zZWxlY3RvcixpLmhhbmRsZXIp +LHRoaXM7aWYodHlwZW9mIGU9PSJvYmplY3QiKXtmb3IocyBpbiBlKXRoaXMub2ZmKHMsbixlW3Nd +KTtyZXR1cm4gdGhpc31pZihuPT09ITF8fHR5cGVvZiBuPT0iZnVuY3Rpb24iKXI9bixuPXQ7cmV0 +dXJuIHI9PT0hMSYmKHI9ZXQpLHRoaXMuZWFjaChmdW5jdGlvbigpe3YuZXZlbnQucmVtb3ZlKHRo +aXMsZSxyLG4pfSl9LGJpbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9uKGUsbnVsbCx0 +LG4pfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vZmYoZSxudWxsLHQpfSxsaXZl +OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdih0aGlzLmNvbnRleHQpLm9uKGUsdGhpcy5zZWxlY3Rv +cix0LG4pLHRoaXN9LGRpZTpmdW5jdGlvbihlLHQpe3JldHVybiB2KHRoaXMuY29udGV4dCkub2Zm +KGUsdGhpcy5zZWxlY3Rvcnx8IioqIix0KSx0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixy +KXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0 +dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwi +KioiLG4pfSx0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigp +e3YuZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSx0 +KXtpZih0aGlzWzBdKXJldHVybiB2LmV2ZW50LnRyaWdnZXIoZSx0LHRoaXNbMF0sITApfSx0b2dn +bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLG49ZS5ndWlkfHx2Lmd1aWQrKyxyPTAsaT1m +dW5jdGlvbihuKXt2YXIgaT0odi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIitlLmd1aWQpfHwwKSVy +O3JldHVybiB2Ll9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2UuZ3VpZCxpKzEpLG4ucHJldmVudERl +ZmF1bHQoKSx0W2ldLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ITF9O2kuZ3VpZD1uO3doaWxlKHI8 +dC5sZW5ndGgpdFtyKytdLmd1aWQ9bjtyZXR1cm4gdGhpcy5jbGljayhpKX0saG92ZXI6ZnVuY3Rp +b24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9fSksdi5l +YWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9h +ZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1v +dXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3du +IGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGUs +dCl7di5mblt0XT1mdW5jdGlvbihlLG4pe3JldHVybiBuPT1udWxsJiYobj1lLGU9bnVsbCksYXJn +dW1lbnRzLmxlbmd0aD4wP3RoaXMub24odCxudWxsLGUsbik6dGhpcy50cmlnZ2VyKHQpfSxRLnRl +c3QodCkmJih2LmV2ZW50LmZpeEhvb2tzW3RdPXYuZXZlbnQua2V5SG9va3MpLEcudGVzdCh0KSYm +KHYuZXZlbnQuZml4SG9va3NbdF09di5ldmVudC5tb3VzZUhvb2tzKX0pLGZ1bmN0aW9uKGUsdCl7 +ZnVuY3Rpb24gbnQoZSx0LG4scil7bj1ufHxbXSx0PXR8fGc7dmFyIGkscyxhLGYsbD10Lm5vZGVU +eXBlO2lmKCFlfHx0eXBlb2YgZSE9InN0cmluZyIpcmV0dXJuIG47aWYobCE9PTEmJmwhPT05KXJl +dHVybltdO2E9byh0KTtpZighYSYmIXIpaWYoaT1SLmV4ZWMoZSkpaWYoZj1pWzFdKXtpZihsPT09 +OSl7cz10LmdldEVsZW1lbnRCeUlkKGYpO2lmKCFzfHwhcy5wYXJlbnROb2RlKXJldHVybiBuO2lm +KHMuaWQ9PT1mKXJldHVybiBuLnB1c2gocyksbn1lbHNlIGlmKHQub3duZXJEb2N1bWVudCYmKHM9 +dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGYpKSYmdSh0LHMpJiZzLmlkPT09ZilyZXR1 +cm4gbi5wdXNoKHMpLG59ZWxzZXtpZihpWzJdKXJldHVybiBTLmFwcGx5KG4seC5jYWxsKHQuZ2V0 +RWxlbWVudHNCeVRhZ05hbWUoZSksMCkpLG47aWYoKGY9aVszXSkmJlomJnQuZ2V0RWxlbWVudHNC +eUNsYXNzTmFtZSlyZXR1cm4gUy5hcHBseShuLHguY2FsbCh0LmdldEVsZW1lbnRzQnlDbGFzc05h +bWUoZiksMCkpLG59cmV0dXJuIHZ0KGUucmVwbGFjZShqLCIkMSIpLHQsbixyLGEpfWZ1bmN0aW9u +IHJ0KGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7 +cmV0dXJuIG49PT0iaW5wdXQiJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBpdChlKXtyZXR1cm4gZnVu +Y3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihuPT09ImlucHV0 +Inx8bj09PSJidXR0b24iKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gc3QoZSl7cmV0dXJuIE4oZnVu +Y3Rpb24odCl7cmV0dXJuIHQ9K3QsTihmdW5jdGlvbihuLHIpe3ZhciBpLHM9ZShbXSxuLmxlbmd0 +aCx0KSxvPXMubGVuZ3RoO3doaWxlKG8tLSluW2k9c1tvXV0mJihuW2ldPSEocltpXT1uW2ldKSl9 +KX0pfWZ1bmN0aW9uIG90KGUsdCxuKXtpZihlPT09dClyZXR1cm4gbjt2YXIgcj1lLm5leHRTaWJs +aW5nO3doaWxlKHIpe2lmKHI9PT10KXJldHVybi0xO3I9ci5uZXh0U2libGluZ31yZXR1cm4gMX1m +dW5jdGlvbiB1dChlLHQpe3ZhciBuLHIscyxvLHUsYSxmLGw9TFtkXVtlKyIgIl07aWYobClyZXR1 +cm4gdD8wOmwuc2xpY2UoMCk7dT1lLGE9W10sZj1pLnByZUZpbHRlcjt3aGlsZSh1KXtpZighbnx8 +KHI9Ri5leGVjKHUpKSlyJiYodT11LnNsaWNlKHJbMF0ubGVuZ3RoKXx8dSksYS5wdXNoKHM9W10p +O249ITE7aWYocj1JLmV4ZWModSkpcy5wdXNoKG49bmV3IG0oci5zaGlmdCgpKSksdT11LnNsaWNl +KG4ubGVuZ3RoKSxuLnR5cGU9clswXS5yZXBsYWNlKGosIiAiKTtmb3IobyBpbiBpLmZpbHRlciko +cj1KW29dLmV4ZWModSkpJiYoIWZbb118fChyPWZbb10ocikpKSYmKHMucHVzaChuPW5ldyBtKHIu +c2hpZnQoKSkpLHU9dS5zbGljZShuLmxlbmd0aCksbi50eXBlPW8sbi5tYXRjaGVzPXIpO2lmKCFu +KWJyZWFrfXJldHVybiB0P3UubGVuZ3RoOnU/bnQuZXJyb3IoZSk6TChlLGEpLnNsaWNlKDApfWZ1 +bmN0aW9uIGF0KGUsdCxyKXt2YXIgaT10LmRpcixzPXImJnQuZGlyPT09InBhcmVudE5vZGUiLG89 +dysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixyKXt3aGlsZSh0PXRbaV0paWYoc3x8dC5u +b2RlVHlwZT09PTEpcmV0dXJuIGUodCxuLHIpfTpmdW5jdGlvbih0LHIsdSl7aWYoIXUpe3ZhciBh +LGY9YisiICIrbysiICIsbD1mK247d2hpbGUodD10W2ldKWlmKHN8fHQubm9kZVR5cGU9PT0xKXtp +ZigoYT10W2RdKT09PWwpcmV0dXJuIHQuc2l6c2V0O2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmYS5p +bmRleE9mKGYpPT09MCl7aWYodC5zaXpzZXQpcmV0dXJuIHR9ZWxzZXt0W2RdPWw7aWYoZSh0LHIs +dSkpcmV0dXJuIHQuc2l6c2V0PSEwLHQ7dC5zaXpzZXQ9ITF9fX1lbHNlIHdoaWxlKHQ9dFtpXSlp +ZihzfHx0Lm5vZGVUeXBlPT09MSlpZihlKHQscix1KSlyZXR1cm4gdH19ZnVuY3Rpb24gZnQoZSl7 +cmV0dXJuIGUubGVuZ3RoPjE/ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUubGVuZ3RoO3doaWxlKGkt +LSlpZighZVtpXSh0LG4scikpcmV0dXJuITE7cmV0dXJuITB9OmVbMF19ZnVuY3Rpb24gbHQoZSx0 +LG4scixpKXt2YXIgcyxvPVtdLHU9MCxhPWUubGVuZ3RoLGY9dCE9bnVsbDtmb3IoO3U8YTt1Kysp +aWYocz1lW3VdKWlmKCFufHxuKHMscixpKSlvLnB1c2gocyksZiYmdC5wdXNoKHUpO3JldHVybiBv +fWZ1bmN0aW9uIGN0KGUsdCxuLHIsaSxzKXtyZXR1cm4gciYmIXJbZF0mJihyPWN0KHIpKSxpJiYh +aVtkXSYmKGk9Y3QoaSxzKSksTihmdW5jdGlvbihzLG8sdSxhKXt2YXIgZixsLGMsaD1bXSxwPVtd +LGQ9by5sZW5ndGgsdj1zfHxkdCh0fHwiKiIsdS5ub2RlVHlwZT9bdV06dSxbXSksbT1lJiYoc3x8 +IXQpP2x0KHYsaCxlLHUsYSk6dixnPW4/aXx8KHM/ZTpkfHxyKT9bXTpvOm07biYmbihtLGcsdSxh +KTtpZihyKXtmPWx0KGcscCkscihmLFtdLHUsYSksbD1mLmxlbmd0aDt3aGlsZShsLS0paWYoYz1m +W2xdKWdbcFtsXV09IShtW3BbbF1dPWMpfWlmKHMpe2lmKGl8fGUpe2lmKGkpe2Y9W10sbD1nLmxl +bmd0aDt3aGlsZShsLS0pKGM9Z1tsXSkmJmYucHVzaChtW2xdPWMpO2kobnVsbCxnPVtdLGYsYSl9 +bD1nLmxlbmd0aDt3aGlsZShsLS0pKGM9Z1tsXSkmJihmPWk/VC5jYWxsKHMsYyk6aFtsXSk+LTEm +JihzW2ZdPSEob1tmXT1jKSl9fWVsc2UgZz1sdChnPT09bz9nLnNwbGljZShkLGcubGVuZ3RoKTpn +KSxpP2kobnVsbCxvLGcsYSk6Uy5hcHBseShvLGcpfSl9ZnVuY3Rpb24gaHQoZSl7dmFyIHQsbixy +LHM9ZS5sZW5ndGgsbz1pLnJlbGF0aXZlW2VbMF0udHlwZV0sdT1vfHxpLnJlbGF0aXZlWyIgIl0s +YT1vPzE6MCxmPWF0KGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0sdSwhMCksbD1hdChmdW5jdGlv +bihlKXtyZXR1cm4gVC5jYWxsKHQsZSk+LTF9LHUsITApLGg9W2Z1bmN0aW9uKGUsbixyKXtyZXR1 +cm4hbyYmKHJ8fG4hPT1jKXx8KCh0PW4pLm5vZGVUeXBlP2YoZSxuLHIpOmwoZSxuLHIpKX1dO2Zv +cig7YTxzO2ErKylpZihuPWkucmVsYXRpdmVbZVthXS50eXBlXSloPVthdChmdChoKSxuKV07ZWxz +ZXtuPWkuZmlsdGVyW2VbYV0udHlwZV0uYXBwbHkobnVsbCxlW2FdLm1hdGNoZXMpO2lmKG5bZF0p +e3I9KythO2Zvcig7cjxzO3IrKylpZihpLnJlbGF0aXZlW2Vbcl0udHlwZV0pYnJlYWs7cmV0dXJu +IGN0KGE+MSYmZnQoaCksYT4xJiZlLnNsaWNlKDAsYS0xKS5qb2luKCIiKS5yZXBsYWNlKGosIiQx +IiksbixhPHImJmh0KGUuc2xpY2UoYSxyKSkscjxzJiZodChlPWUuc2xpY2UocikpLHI8cyYmZS5q +b2luKCIiKSl9aC5wdXNoKG4pfXJldHVybiBmdChoKX1mdW5jdGlvbiBwdChlLHQpe3ZhciByPXQu +bGVuZ3RoPjAscz1lLmxlbmd0aD4wLG89ZnVuY3Rpb24odSxhLGYsbCxoKXt2YXIgcCxkLHYsbT1b +XSx5PTAsdz0iMCIseD11JiZbXSxUPWghPW51bGwsTj1jLEM9dXx8cyYmaS5maW5kLlRBRygiKiIs +aCYmYS5wYXJlbnROb2RlfHxhKSxrPWIrPU49PW51bGw/MTpNYXRoLkU7VCYmKGM9YSE9PWcmJmEs +bj1vLmVsKTtmb3IoOyhwPUNbd10pIT1udWxsO3crKyl7aWYocyYmcCl7Zm9yKGQ9MDt2PWVbZF07 +ZCsrKWlmKHYocCxhLGYpKXtsLnB1c2gocCk7YnJlYWt9VCYmKGI9ayxuPSsrby5lbCl9ciYmKChw +PSF2JiZwKSYmeS0tLHUmJngucHVzaChwKSl9eSs9dztpZihyJiZ3IT09eSl7Zm9yKGQ9MDt2PXRb +ZF07ZCsrKXYoeCxtLGEsZik7aWYodSl7aWYoeT4wKXdoaWxlKHctLSkheFt3XSYmIW1bd10mJiht +W3ddPUUuY2FsbChsKSk7bT1sdChtKX1TLmFwcGx5KGwsbSksVCYmIXUmJm0ubGVuZ3RoPjAmJnkr +dC5sZW5ndGg+MSYmbnQudW5pcXVlU29ydChsKX1yZXR1cm4gVCYmKGI9ayxjPU4pLHh9O3JldHVy +biBvLmVsPTAscj9OKG8pOm99ZnVuY3Rpb24gZHQoZSx0LG4pe3ZhciByPTAsaT10Lmxlbmd0aDtm +b3IoO3I8aTtyKyspbnQoZSx0W3JdLG4pO3JldHVybiBufWZ1bmN0aW9uIHZ0KGUsdCxuLHIscyl7 +dmFyIG8sdSxmLGwsYyxoPXV0KGUpLHA9aC5sZW5ndGg7aWYoIXImJmgubGVuZ3RoPT09MSl7dT1o +WzBdPWhbMF0uc2xpY2UoMCk7aWYodS5sZW5ndGg+MiYmKGY9dVswXSkudHlwZT09PSJJRCImJnQu +bm9kZVR5cGU9PT05JiYhcyYmaS5yZWxhdGl2ZVt1WzFdLnR5cGVdKXt0PWkuZmluZC5JRChmLm1h +dGNoZXNbMF0ucmVwbGFjZSgkLCIiKSx0LHMpWzBdO2lmKCF0KXJldHVybiBuO2U9ZS5zbGljZSh1 +LnNoaWZ0KCkubGVuZ3RoKX1mb3Iobz1KLlBPUy50ZXN0KGUpPy0xOnUubGVuZ3RoLTE7bz49MDtv +LS0pe2Y9dVtvXTtpZihpLnJlbGF0aXZlW2w9Zi50eXBlXSlicmVhaztpZihjPWkuZmluZFtsXSlp +ZihyPWMoZi5tYXRjaGVzWzBdLnJlcGxhY2UoJCwiIiksei50ZXN0KHVbMF0udHlwZSkmJnQucGFy +ZW50Tm9kZXx8dCxzKSl7dS5zcGxpY2UobywxKSxlPXIubGVuZ3RoJiZ1LmpvaW4oIiIpO2lmKCFl +KXJldHVybiBTLmFwcGx5KG4seC5jYWxsKHIsMCkpLG47YnJlYWt9fX1yZXR1cm4gYShlLGgpKHIs +dCxzLG4sei50ZXN0KGUpKSxufWZ1bmN0aW9uIG10KCl7fXZhciBuLHIsaSxzLG8sdSxhLGYsbCxj +LGg9ITAscD0idW5kZWZpbmVkIixkPSgic2l6Y2FjaGUiK01hdGgucmFuZG9tKCkpLnJlcGxhY2Uo +Ii4iLCIiKSxtPVN0cmluZyxnPWUuZG9jdW1lbnQseT1nLmRvY3VtZW50RWxlbWVudCxiPTAsdz0w +LEU9W10ucG9wLFM9W10ucHVzaCx4PVtdLnNsaWNlLFQ9W10uaW5kZXhPZnx8ZnVuY3Rpb24oZSl7 +dmFyIHQ9MCxuPXRoaXMubGVuZ3RoO2Zvcig7dDxuO3QrKylpZih0aGlzW3RdPT09ZSlyZXR1cm4g +dDtyZXR1cm4tMX0sTj1mdW5jdGlvbihlLHQpe3JldHVybiBlW2RdPXQ9PW51bGx8fHQsZX0sQz1m +dW5jdGlvbigpe3ZhciBlPXt9LHQ9W107cmV0dXJuIE4oZnVuY3Rpb24obixyKXtyZXR1cm4gdC5w +dXNoKG4pPmkuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Quc2hpZnQoKV0sZVtuKyIgIl09cn0sZSl9 +LGs9QygpLEw9QygpLEE9QygpLE89IltcXHgyMFxcdFxcclxcblxcZl0iLE09Iig/OlxcXFwufFst +XFx3XXxbXlxceDAwLVxceGEwXSkrIixfPU0ucmVwbGFjZSgidyIsIncjIiksRD0iKFsqXiR8IX5d +Pz0pIixQPSJcXFsiK08rIiooIitNKyIpIitPKyIqKD86IitEK08rIiooPzooWydcIl0pKCg/Olxc +XFwufFteXFxcXF0pKj8pXFwzfCgiK18rIil8KXwpIitPKyIqXFxdIixIPSI6KCIrTSsiKSg/Olxc +KCg/OihbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDJ8KFteKClbXFxdXSp8KD86KD86IitQ +KyIpfFteOl18XFxcXC4pKnwuKikpXFwpfCkiLEI9IjooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZp +cnN0fGxhc3QpKD86XFwoIitPKyIqKCg/Oi1cXGQpP1xcZCopIitPKyIqXFwpfCkoPz1bXi1dfCQp +IixqPW5ldyBSZWdFeHAoIl4iK08rIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTysiKyQi +LCJnIiksRj1uZXcgUmVnRXhwKCJeIitPKyIqLCIrTysiKiIpLEk9bmV3IFJlZ0V4cCgiXiIrTysi +KihbXFx4MjBcXHRcXHJcXG5cXGY+K35dKSIrTysiKiIpLHE9bmV3IFJlZ0V4cChIKSxSPS9eKD86 +IyhbXHdcLV0rKXwoXHcrKXxcLihbXHdcLV0rKSkkLyxVPS9eOm5vdC8sej0vW1x4MjBcdFxyXG5c +Zl0qWyt+XS8sVz0vOm5vdFwoJC8sWD0vaFxkL2ksVj0vaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1 +dHRvbi9pLCQ9L1xcKD8hXFwpL2csSj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitNKyIpIiksQ0xBU1M6 +bmV3IFJlZ0V4cCgiXlxcLigiK00rIikiKSxOQU1FOm5ldyBSZWdFeHAoIl5cXFtuYW1lPVsnXCJd +PygiK00rIilbJ1wiXT9cXF0iKSxUQUc6bmV3IFJlZ0V4cCgiXigiK00ucmVwbGFjZSgidyIsIncq +IikrIikiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK1ApLFBTRVVETzpuZXcgUmVnRXhwKCJeIitIKSxQ +T1M6bmV3IFJlZ0V4cChCLCJpIiksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxudGh8Zmlyc3R8 +bGFzdCktY2hpbGQoPzpcXCgiK08rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK08rIioo +PzooWystXXwpIitPKyIqKFxcZCspfCkpIitPKyIqXFwpfCkiLCJpIiksbmVlZHNDb250ZXh0Om5l +dyBSZWdFeHAoIl4iK08rIipbPit+XXwiK0IsImkiKX0sSz1mdW5jdGlvbihlKXt2YXIgdD1nLmNy +ZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4gZSh0KX1jYXRjaChuKXtyZXR1cm4hMX1maW5h +bGx5e3Q9bnVsbH19LFE9SyhmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChnLmNyZWF0 +ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLEc9Syhm +dW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLGUuZmlyc3RD +aGlsZCYmdHlwZW9mIGUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPT1wJiZlLmZpcnN0Q2hpbGQu +Z2V0QXR0cmlidXRlKCJocmVmIik9PT0iIyJ9KSxZPUsoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9 +IjxzZWxlY3Q+PC9zZWxlY3Q+Ijt2YXIgdD10eXBlb2YgZS5sYXN0Q2hpbGQuZ2V0QXR0cmlidXRl +KCJtdWx0aXBsZSIpO3JldHVybiB0IT09ImJvb2xlYW4iJiZ0IT09InN0cmluZyJ9KSxaPUsoZnVu +Y3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdoaWRkZW4gZSc+PC9kaXY+ +PGRpdiBjbGFzcz0naGlkZGVuJz48L2Rpdj4iLCFlLmdldEVsZW1lbnRzQnlDbGFzc05hbWV8fCFl +LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg/ITE6KGUubGFzdENoaWxkLmNsYXNz +TmFtZT0iZSIsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09Mil9KSxldD1L +KGZ1bmN0aW9uKGUpe2UuaWQ9ZCswLGUuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIic+PC9hPjxk +aXYgbmFtZT0nIitkKyInPjwvZGl2PiIseS5pbnNlcnRCZWZvcmUoZSx5LmZpcnN0Q2hpbGQpO3Zh +ciB0PWcuZ2V0RWxlbWVudHNCeU5hbWUmJmcuZ2V0RWxlbWVudHNCeU5hbWUoZCkubGVuZ3RoPT09 +MitnLmdldEVsZW1lbnRzQnlOYW1lKGQrMCkubGVuZ3RoO3JldHVybiByPSFnLmdldEVsZW1lbnRC +eUlkKGQpLHkucmVtb3ZlQ2hpbGQoZSksdH0pO3RyeXt4LmNhbGwoeS5jaGlsZE5vZGVzLDApWzBd +Lm5vZGVUeXBlfWNhdGNoKHR0KXt4PWZ1bmN0aW9uKGUpe3ZhciB0LG49W107Zm9yKDt0PXRoaXNb +ZV07ZSsrKW4ucHVzaCh0KTtyZXR1cm4gbn19bnQubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVy +biBudChlLG51bGwsbnVsbCx0KX0sbnQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7cmV0 +dXJuIG50KHQsbnVsbCxudWxsLFtlXSkubGVuZ3RoPjB9LHM9bnQuZ2V0VGV4dD1mdW5jdGlvbihl +KXt2YXIgdCxuPSIiLHI9MCxpPWUubm9kZVR5cGU7aWYoaSl7aWYoaT09PTF8fGk9PT05fHxpPT09 +MTEpe2lmKHR5cGVvZiBlLnRleHRDb250ZW50PT0ic3RyaW5nIilyZXR1cm4gZS50ZXh0Q29udGVu +dDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9cyhlKX1lbHNlIGlmKGk9 +PT0zfHxpPT09NClyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSBmb3IoO3Q9ZVtyXTtyKyspbis9cyh0 +KTtyZXR1cm4gbn0sbz1udC5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3Vt +ZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIHQ/dC5ub2RlTmFtZSE9PSJIVE1MIjohMX0s +dT1udC5jb250YWlucz15LmNvbnRhaW5zP2Z1bmN0aW9uKGUsdCl7dmFyIG49ZS5ub2RlVHlwZT09 +PTk/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEh +KHImJnIubm9kZVR5cGU9PT0xJiZuLmNvbnRhaW5zJiZuLmNvbnRhaW5zKHIpKX06eS5jb21wYXJl +RG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihlLHQpe3JldHVybiB0JiYhIShlLmNvbXBhcmVEb2N1 +bWVudFBvc2l0aW9uKHQpJjE2KX06ZnVuY3Rpb24oZSx0KXt3aGlsZSh0PXQucGFyZW50Tm9kZSlp +Zih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sbnQuYXR0cj1mdW5jdGlvbihlLHQpe3ZhciBuLHI9 +byhlKTtyZXR1cm4gcnx8KHQ9dC50b0xvd2VyQ2FzZSgpKSwobj1pLmF0dHJIYW5kbGVbdF0pP24o +ZSk6cnx8WT9lLmdldEF0dHJpYnV0ZSh0KToobj1lLmdldEF0dHJpYnV0ZU5vZGUodCksbj90eXBl +b2YgZVt0XT09ImJvb2xlYW4iP2VbdF0/dDpudWxsOm4uc3BlY2lmaWVkP24udmFsdWU6bnVsbDpu +dWxsKX0saT1udC5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpOLG1hdGNo +OkosYXR0ckhhbmRsZTpHP3t9OntocmVmOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0 +ZSgiaHJlZiIsMil9LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJ0eXBl +Iil9fSxmaW5kOntJRDpyP2Z1bmN0aW9uKGUsdCxuKXtpZih0eXBlb2YgdC5nZXRFbGVtZW50QnlJ +ZCE9PXAmJiFuKXt2YXIgcj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiByJiZyLnBhcmVudE5v +ZGU/W3JdOltdfX06ZnVuY3Rpb24oZSxuLHIpe2lmKHR5cGVvZiBuLmdldEVsZW1lbnRCeUlkIT09 +cCYmIXIpe3ZhciBpPW4uZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIGk/aS5pZD09PWV8fHR5cGVv +ZiBpLmdldEF0dHJpYnV0ZU5vZGUhPT1wJiZpLmdldEF0dHJpYnV0ZU5vZGUoImlkIikudmFsdWU9 +PT1lP1tpXTp0OltdfX0sVEFHOlE/ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdC5nZXRFbGVtZW50 +c0J5VGFnTmFtZSE9PXApcmV0dXJuIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSl9OmZ1bmN0aW9u +KGUsdCl7dmFyIG49dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTtpZihlPT09IioiKXt2YXIgcixp +PVtdLHM9MDtmb3IoO3I9bltzXTtzKyspci5ub2RlVHlwZT09PTEmJmkucHVzaChyKTtyZXR1cm4g +aX1yZXR1cm4gbn0sTkFNRTpldCYmZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdC5nZXRFbGVtZW50 +c0J5TmFtZSE9PXApcmV0dXJuIHQuZ2V0RWxlbWVudHNCeU5hbWUobmFtZSl9LENMQVNTOlomJmZ1 +bmN0aW9uKGUsdCxuKXtpZih0eXBlb2YgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT09cCYmIW4p +cmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX19LHJlbGF0aXZlOnsiPiI6e2Rpcjoi +cGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InBy +ZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJl +RmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZSgkLCIiKSxl +WzNdPShlWzRdfHxlWzVdfHwiIikucmVwbGFjZSgkLCIiKSxlWzJdPT09In49IiYmKGVbM109IiAi +K2VbM10rIiAiKSxlLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVb +MV0udG9Mb3dlckNhc2UoKSxlWzFdPT09Im50aCI/KGVbMl18fG50LmVycm9yKGVbMF0pLGVbM109 +KyhlWzNdP2VbNF0rKGVbNV18fDEpOjIqKGVbMl09PT0iZXZlbiJ8fGVbMl09PT0ib2RkIikpLGVb +NF09KyhlWzZdK2VbN118fGVbMl09PT0ib2RkIikpOmVbMl0mJm50LmVycm9yKGVbMF0pLGV9LFBT +RVVETzpmdW5jdGlvbihlKXt2YXIgdCxuO2lmKEouQ0hJTEQudGVzdChlWzBdKSlyZXR1cm4gbnVs +bDtpZihlWzNdKWVbMl09ZVszXTtlbHNlIGlmKHQ9ZVs0XSlxLnRlc3QodCkmJihuPXV0KHQsITAp +KSYmKG49dC5pbmRleE9mKCIpIix0Lmxlbmd0aC1uKS10Lmxlbmd0aCkmJih0PXQuc2xpY2UoMCxu +KSxlWzBdPWVbMF0uc2xpY2UoMCxuKSksZVsyXT10O3JldHVybiBlLnNsaWNlKDAsMyl9fSxmaWx0 +ZXI6e0lEOnI/ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5yZXBsYWNlKCQsIiIpLGZ1bmN0aW9uKHQp +e3JldHVybiB0LmdldEF0dHJpYnV0ZSgiaWQiKT09PWV9fTpmdW5jdGlvbihlKXtyZXR1cm4gZT1l +LnJlcGxhY2UoJCwiIiksZnVuY3Rpb24odCl7dmFyIG49dHlwZW9mIHQuZ2V0QXR0cmlidXRlTm9k +ZSE9PXAmJnQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PWV9fSxU +QUc6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0iKiI/ZnVuY3Rpb24oKXtyZXR1cm4hMH06KGU9ZS5y +ZXBsYWNlKCQsIiIpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZU5hbWUm +JnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWV9KX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9 +a1tkXVtlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrTysiKSIrZSsiKCIrTysi +fCQpIikpJiZrKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChlLmNsYXNzTmFtZXx8dHlwZW9m +IGUuZ2V0QXR0cmlidXRlIT09cCYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRS +OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocixpKXt2YXIgcz1udC5hdHRyKHIsZSk7 +cmV0dXJuIHM9PW51bGw/dD09PSIhPSI6dD8ocys9IiIsdD09PSI9Ij9zPT09bjp0PT09IiE9Ij9z +IT09bjp0PT09Il49Ij9uJiZzLmluZGV4T2Yobik9PT0wOnQ9PT0iKj0iP24mJnMuaW5kZXhPZihu +KT4tMTp0PT09IiQ9Ij9uJiZzLnN1YnN0cihzLmxlbmd0aC1uLmxlbmd0aCk9PT1uOnQ9PT0ifj0i +PygiICIrcysiICIpLmluZGV4T2Yobik+LTE6dD09PSJ8PSI/cz09PW58fHMuc3Vic3RyKDAsbi5s +ZW5ndGgrMSk9PT1uKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4g +ZT09PSJudGgiP2Z1bmN0aW9uKGUpe3ZhciB0LGkscz1lLnBhcmVudE5vZGU7aWYobj09PTEmJnI9 +PT0wKXJldHVybiEwO2lmKHMpe2k9MDtmb3IodD1zLmZpcnN0Q2hpbGQ7dDt0PXQubmV4dFNpYmxp +bmcpaWYodC5ub2RlVHlwZT09PTEpe2krKztpZihlPT09dClicmVha319cmV0dXJuIGktPXIsaT09 +PW58fGklbj09PTAmJmkvbj49MH06ZnVuY3Rpb24odCl7dmFyIG49dDtzd2l0Y2goZSl7Y2FzZSJv +bmx5IjpjYXNlImZpcnN0Ijp3aGlsZShuPW4ucHJldmlvdXNTaWJsaW5nKWlmKG4ubm9kZVR5cGU9 +PT0xKXJldHVybiExO2lmKGU9PT0iZmlyc3QiKXJldHVybiEwO249dDtjYXNlImxhc3QiOndoaWxl +KG49bi5uZXh0U2libGluZylpZihuLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMH19fSxQ +U0VVRE86ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkucHNldWRvc1tlXXx8aS5zZXRGaWx0ZXJzW2Uu +dG9Mb3dlckNhc2UoKV18fG50LmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJu +IHJbZF0/cih0KTpyLmxlbmd0aD4xPyhuPVtlLGUsIiIsdF0saS5zZXRGaWx0ZXJzLmhhc093blBy +b3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/TihmdW5jdGlvbihlLG4pe3ZhciBpLHM9cihlLHQpLG89 +cy5sZW5ndGg7d2hpbGUoby0tKWk9VC5jYWxsKGUsc1tvXSksZVtpXT0hKG5baV09c1tvXSl9KTpm +dW5jdGlvbihlKXtyZXR1cm4gcihlLDAsbil9KTpyfX0scHNldWRvczp7bm90Ok4oZnVuY3Rpb24o +ZSl7dmFyIHQ9W10sbj1bXSxyPWEoZS5yZXBsYWNlKGosIiQxIikpO3JldHVybiByW2RdP04oZnVu +Y3Rpb24oZSx0LG4saSl7dmFyIHMsbz1yKGUsbnVsbCxpLFtdKSx1PWUubGVuZ3RoO3doaWxlKHUt +LSlpZihzPW9bdV0pZVt1XT0hKHRbdV09cyl9KTpmdW5jdGlvbihlLGkscyl7cmV0dXJuIHRbMF09 +ZSxyKHQsbnVsbCxzLG4pLCFuLnBvcCgpfX0pLGhhczpOKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5j +dGlvbih0KXtyZXR1cm4gbnQoZSx0KS5sZW5ndGg+MH19KSxjb250YWluczpOKGZ1bmN0aW9uKGUp +e3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4odC50ZXh0Q29udGVudHx8dC5pbm5lclRleHR8fHMo +dCkpLmluZGV4T2YoZSk+LTF9fSksZW5hYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxl +ZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD09PSEwfSxjaGVj +a2VkOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gdD09 +PSJpbnB1dCImJiEhZS5jaGVja2VkfHx0PT09Im9wdGlvbiImJiEhZS5zZWxlY3RlZH0sc2VsZWN0 +ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVk +SW5kZXgsZS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWkucHNldWRv +cy5lbXB0eShlKX0sZW1wdHk6ZnVuY3Rpb24oZSl7dmFyIHQ7ZT1lLmZpcnN0Q2hpbGQ7d2hpbGUo +ZSl7aWYoZS5ub2RlTmFtZT4iQCJ8fCh0PWUubm9kZVR5cGUpPT09M3x8dD09PTQpcmV0dXJuITE7 +ZT1lLm5leHRTaWJsaW5nfXJldHVybiEwfSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIFgudGVz +dChlLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiBlLm5vZGVOYW1l +LnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYodD1lLnR5cGUpPT09InRleHQiJiYoKG49ZS5nZXRB +dHRyaWJ1dGUoInR5cGUiKSk9PW51bGx8fG4udG9Mb3dlckNhc2UoKT09PXQpfSxyYWRpbzpydCgi +cmFkaW8iKSxjaGVja2JveDpydCgiY2hlY2tib3giKSxmaWxlOnJ0KCJmaWxlIikscGFzc3dvcmQ6 +cnQoInBhc3N3b3JkIiksaW1hZ2U6cnQoImltYWdlIiksc3VibWl0Oml0KCJzdWJtaXQiKSxyZXNl +dDppdCgicmVzZXQiKSxidXR0b246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2Vy +Q2FzZSgpO3JldHVybiB0PT09ImlucHV0IiYmZS50eXBlPT09ImJ1dHRvbiJ8fHQ9PT0iYnV0dG9u +In0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFYudGVzdChlLm5vZGVOYW1lKX0sZm9jdXM6ZnVu +Y3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50O3JldHVybiBlPT09dC5hY3RpdmVFbGVtZW50 +JiYoIXQuaGFzRm9jdXN8fHQuaGFzRm9jdXMoKSkmJiEhKGUudHlwZXx8ZS5ocmVmfHx+ZS50YWJJ +bmRleCl9LGFjdGl2ZTpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWUub3duZXJEb2N1bWVudC5hY3Rp +dmVFbGVtZW50fSxmaXJzdDpzdChmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6c3QoZnVuY3Rp +b24oZSx0KXtyZXR1cm5bdC0xXX0pLGVxOnN0KGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bbjwwP24r +dDpuXX0pLGV2ZW46c3QoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHQ7bis9MillLnB1c2go +bik7cmV0dXJuIGV9KSxvZGQ6c3QoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MTtuPHQ7bis9Mill +LnB1c2gobik7cmV0dXJuIGV9KSxsdDpzdChmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9u +K3Q6bjstLXI+PTA7KWUucHVzaChyKTtyZXR1cm4gZX0pLGd0OnN0KGZ1bmN0aW9uKGUsdCxuKXtm +b3IodmFyIHI9bjwwP24rdDpuOysrcjx0OyllLnB1c2gocik7cmV0dXJuIGV9KX19LGY9eS5jb21w +YXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dD8obD0hMCwwKToo +IWUuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Uu +Y29tcGFyZURvY3VtZW50UG9zaXRpb246ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSY0KT8t +MToxfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBsPSEwLDA7aWYoZS5zb3VyY2VJbmRl +eCYmdC5zb3VyY2VJbmRleClyZXR1cm4gZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O3ZhciBu +LHIsaT1bXSxzPVtdLG89ZS5wYXJlbnROb2RlLHU9dC5wYXJlbnROb2RlLGE9bztpZihvPT09dSly +ZXR1cm4gb3QoZSx0KTtpZighbylyZXR1cm4tMTtpZighdSlyZXR1cm4gMTt3aGlsZShhKWkudW5z +aGlmdChhKSxhPWEucGFyZW50Tm9kZTthPXU7d2hpbGUoYSlzLnVuc2hpZnQoYSksYT1hLnBhcmVu +dE5vZGU7bj1pLmxlbmd0aCxyPXMubGVuZ3RoO2Zvcih2YXIgZj0wO2Y8biYmZjxyO2YrKylpZihp +W2ZdIT09c1tmXSlyZXR1cm4gb3QoaVtmXSxzW2ZdKTtyZXR1cm4gZj09PW4/b3QoZSxzW2ZdLC0x +KTpvdChpW2ZdLHQsMSl9LFswLDBdLnNvcnQoZiksaD0hbCxudC51bmlxdWVTb3J0PWZ1bmN0aW9u +KGUpe3ZhciB0LG49W10scj0xLGk9MDtsPWgsZS5zb3J0KGYpO2lmKGwpe2Zvcig7dD1lW3JdO3Ir +Kyl0PT09ZVtyLTFdJiYoaT1uLnB1c2gocikpO3doaWxlKGktLSllLnNwbGljZShuW2ldLDEpfXJl +dHVybiBlfSxudC5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJv +ciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LGE9bnQuY29tcGlsZT1mdW5jdGlvbihl +LHQpe3ZhciBuLHI9W10saT1bXSxzPUFbZF1bZSsiICJdO2lmKCFzKXt0fHwodD11dChlKSksbj10 +Lmxlbmd0aDt3aGlsZShuLS0pcz1odCh0W25dKSxzW2RdP3IucHVzaChzKTppLnB1c2gocyk7cz1B +KGUscHQoaSxyKSl9cmV0dXJuIHN9LGcucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIg +ZSx0PXZ0LG49Lyd8XFwvZyxyPS9cPVtceDIwXHRcclxuXGZdKihbXiciXF1dKilbXHgyMFx0XHJc +blxmXSpcXS9nLGk9WyI6Zm9jdXMiXSxzPVsiOmFjdGl2ZSJdLHU9eS5tYXRjaGVzU2VsZWN0b3J8 +fHkubW96TWF0Y2hlc1NlbGVjdG9yfHx5LndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8eS5vTWF0Y2hl +c1NlbGVjdG9yfHx5Lm1zTWF0Y2hlc1NlbGVjdG9yO0soZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9 +IjxzZWxlY3Q+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlT +ZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8aS5wdXNoKCJcXFsiK08rIiooPzpjaGVj +a2VkfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfHJlYWRvbmx5fHNlbGVjdGVkfHZhbHVlKSIpLGUu +cXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fGkucHVzaCgiOmNoZWNrZWQiKX0p +LEsoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxwIHRlc3Q9Jyc+PC9wPiIsZS5xdWVyeVNlbGVj +dG9yQWxsKCJbdGVzdF49JyddIikubGVuZ3RoJiZpLnB1c2goIlsqXiRdPSIrTysiKig/OlwiXCJ8 +JycpIiksZS5pbm5lckhUTUw9IjxpbnB1dCB0eXBlPSdoaWRkZW4nLz4iLGUucXVlcnlTZWxlY3Rv +ckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fGkucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKX0p +LGk9bmV3IFJlZ0V4cChpLmpvaW4oInwiKSksdnQ9ZnVuY3Rpb24oZSxyLHMsbyx1KXtpZighbyYm +IXUmJiFpLnRlc3QoZSkpe3ZhciBhLGYsbD0hMCxjPWQsaD1yLHA9ci5ub2RlVHlwZT09PTkmJmU7 +aWYoci5ub2RlVHlwZT09PTEmJnIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXth +PXV0KGUpLChsPXIuZ2V0QXR0cmlidXRlKCJpZCIpKT9jPWwucmVwbGFjZShuLCJcXCQmIik6ci5z +ZXRBdHRyaWJ1dGUoImlkIixjKSxjPSJbaWQ9JyIrYysiJ10gIixmPWEubGVuZ3RoO3doaWxlKGYt +LSlhW2ZdPWMrYVtmXS5qb2luKCIiKTtoPXoudGVzdChlKSYmci5wYXJlbnROb2RlfHxyLHA9YS5q +b2luKCIsIil9aWYocCl0cnl7cmV0dXJuIFMuYXBwbHkocyx4LmNhbGwoaC5xdWVyeVNlbGVjdG9y +QWxsKHApLDApKSxzfWNhdGNoKHYpe31maW5hbGx5e2x8fHIucmVtb3ZlQXR0cmlidXRlKCJpZCIp +fX1yZXR1cm4gdChlLHIscyxvLHUpfSx1JiYoSyhmdW5jdGlvbih0KXtlPXUuY2FsbCh0LCJkaXYi +KTt0cnl7dS5jYWxsKHQsIlt0ZXN0IT0nJ106c2l6emxlIikscy5wdXNoKCIhPSIsSCl9Y2F0Y2go +bil7fX0pLHM9bmV3IFJlZ0V4cChzLmpvaW4oInwiKSksbnQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0 +aW9uKHQsbil7bj1uLnJlcGxhY2UociwiPSckMSddIik7aWYoIW8odCkmJiFzLnRlc3QobikmJiFp +LnRlc3QobikpdHJ5e3ZhciBhPXUuY2FsbCh0LG4pO2lmKGF8fGV8fHQuZG9jdW1lbnQmJnQuZG9j +dW1lbnQubm9kZVR5cGUhPT0xMSlyZXR1cm4gYX1jYXRjaChmKXt9cmV0dXJuIG50KG4sbnVsbCxu +dWxsLFt0XSkubGVuZ3RoPjB9KX0oKSxpLnBzZXVkb3MubnRoPWkucHNldWRvcy5lcSxpLmZpbHRl +cnM9bXQucHJvdG90eXBlPWkucHNldWRvcyxpLnNldEZpbHRlcnM9bmV3IG10LG50LmF0dHI9di5h +dHRyLHYuZmluZD1udCx2LmV4cHI9bnQuc2VsZWN0b3JzLHYuZXhwclsiOiJdPXYuZXhwci5wc2V1 +ZG9zLHYudW5pcXVlPW50LnVuaXF1ZVNvcnQsdi50ZXh0PW50LmdldFRleHQsdi5pc1hNTERvYz1u +dC5pc1hNTCx2LmNvbnRhaW5zPW50LmNvbnRhaW5zfShlKTt2YXIgbnQ9L1VudGlsJC8scnQ9L14o +PzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8saXQ9L14uW146I1xbXC4sXSokLyxzdD12LmV4 +cHIubWF0Y2gubmVlZHNDb250ZXh0LG90PXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEw +LHByZXY6ITB9O3YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLHMsbyx1 +PXRoaXM7aWYodHlwZW9mIGUhPSJzdHJpbmciKXJldHVybiB2KGUpLmZpbHRlcihmdW5jdGlvbigp +e2Zvcih0PTAsbj11Lmxlbmd0aDt0PG47dCsrKWlmKHYuY29udGFpbnModVt0XSx0aGlzKSlyZXR1 +cm4hMH0pO289dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGUpO2Zvcih0PTAsbj10aGlzLmxlbmd0 +aDt0PG47dCsrKXtyPW8ubGVuZ3RoLHYuZmluZChlLHRoaXNbdF0sbyk7aWYodD4wKWZvcihpPXI7 +aTxvLmxlbmd0aDtpKyspZm9yKHM9MDtzPHI7cysrKWlmKG9bc109PT1vW2ldKXtvLnNwbGljZShp +LS0sMSk7YnJlYWt9fXJldHVybiBvfSxoYXM6ZnVuY3Rpb24oZSl7dmFyIHQsbj12KGUsdGhpcyks +cj1uLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0Kysp +aWYodi5jb250YWlucyh0aGlzLG5bdF0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1 +cm4gdGhpcy5wdXNoU3RhY2soZnQodGhpcyxlLCExKSwibm90IixlKX0sZmlsdGVyOmZ1bmN0aW9u +KGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmdCh0aGlzLGUsITApLCJmaWx0ZXIiLGUpfSxpczpm +dW5jdGlvbihlKXtyZXR1cm4hIWUmJih0eXBlb2YgZT09InN0cmluZyI/c3QudGVzdChlKT92KGUs +dGhpcy5jb250ZXh0KS5pbmRleCh0aGlzWzBdKT49MDp2LmZpbHRlcihlLHRoaXMpLmxlbmd0aD4w +OnRoaXMuZmlsdGVyKGUpLmxlbmd0aD4wKX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9 +MCxpPXRoaXMubGVuZ3RoLHM9W10sbz1zdC50ZXN0KGUpfHx0eXBlb2YgZSE9InN0cmluZyI/dihl +LHR8fHRoaXMuY29udGV4dCk6MDtmb3IoO3I8aTtyKyspe249dGhpc1tyXTt3aGlsZShuJiZuLm93 +bmVyRG9jdW1lbnQmJm4hPT10JiZuLm5vZGVUeXBlIT09MTEpe2lmKG8/by5pbmRleChuKT4tMTp2 +LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpe3MucHVzaChuKTticmVha31uPW4ucGFyZW50Tm9k +ZX19cmV0dXJuIHM9cy5sZW5ndGg+MT92LnVuaXF1ZShzKTpzLHRoaXMucHVzaFN0YWNrKHMsImNs +b3Nlc3QiLGUpfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT90eXBlb2YgZT09InN0cmluZyI/ +di5pbkFycmF5KHRoaXNbMF0sdihlKSk6di5pbkFycmF5KGUuanF1ZXJ5P2VbMF06ZSx0aGlzKTp0 +aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6 +ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZT09InN0cmluZyI/dihlLHQpOnYubWFrZUFycmF5 +KGUmJmUubm9kZVR5cGU/W2VdOmUpLHI9di5tZXJnZSh0aGlzLmdldCgpLG4pO3JldHVybiB0aGlz +LnB1c2hTdGFjayh1dChuWzBdKXx8dXQoclswXSk/cjp2LnVuaXF1ZShyKSl9LGFkZEJhY2s6ZnVu +Y3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKGU9PW51bGw/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJl +dk9iamVjdC5maWx0ZXIoZSkpfX0pLHYuZm4uYW5kU2VsZj12LmZuLmFkZEJhY2ssdi5lYWNoKHtw +YXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiZ0Lm5vZGVUeXBl +IT09MTE/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiB2LmRpcihlLCJwYXJlbnRO +b2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHYuZGlyKGUsInBhcmVu +dE5vZGUiLG4pfSxuZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBhdChlLCJuZXh0U2libGluZyIpfSxw +cmV2OmZ1bmN0aW9uKGUpe3JldHVybiBhdChlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpm +dW5jdGlvbihlKXtyZXR1cm4gdi5kaXIoZSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlv +bihlKXtyZXR1cm4gdi5kaXIoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlv +bihlLHQsbil7cmV0dXJuIHYuZGlyKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0 +aW9uKGUsdCxuKXtyZXR1cm4gdi5kaXIoZSwicHJldmlvdXNTaWJsaW5nIixuKX0sc2libGluZ3M6 +ZnVuY3Rpb24oZSl7cmV0dXJuIHYuc2libGluZygoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGls +ZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIHYuc2libGluZyhlLmZpcnN0Q2hpbGQp +fSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gdi5ub2RlTmFtZShlLCJpZnJhbWUiKT9lLmNv +bnRlbnREb2N1bWVudHx8ZS5jb250ZW50V2luZG93LmRvY3VtZW50OnYubWVyZ2UoW10sZS5jaGls +ZE5vZGVzKX19LGZ1bmN0aW9uKGUsdCl7di5mbltlXT1mdW5jdGlvbihuLHIpe3ZhciBpPXYubWFw +KHRoaXMsdCxuKTtyZXR1cm4gbnQudGVzdChlKXx8KHI9biksciYmdHlwZW9mIHI9PSJzdHJpbmci +JiYoaT12LmZpbHRlcihyLGkpKSxpPXRoaXMubGVuZ3RoPjEmJiFvdFtlXT92LnVuaXF1ZShpKTpp +LHRoaXMubGVuZ3RoPjEmJnJ0LnRlc3QoZSkmJihpPWkucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFj +ayhpLGUsbC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSx2LmV4dGVuZCh7ZmlsdGVyOmZ1 +bmN0aW9uKGUsdCxuKXtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksdC5sZW5ndGg9PT0xP3Yu +ZmluZC5tYXRjaGVzU2VsZWN0b3IodFswXSxlKT9bdFswXV06W106di5maW5kLm1hdGNoZXMoZSx0 +KX0sZGlyOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1bXSxzPWVbbl07d2hpbGUocyYmcy5ub2RlVHlw +ZSE9PTkmJihyPT09dHx8cy5ub2RlVHlwZSE9PTF8fCF2KHMpLmlzKHIpKSlzLm5vZGVUeXBlPT09 +MSYmaS5wdXNoKHMpLHM9c1tuXTtyZXR1cm4gaX0sc2libGluZzpmdW5jdGlvbihlLHQpe3ZhciBu +PVtdO2Zvcig7ZTtlPWUubmV4dFNpYmxpbmcpZS5ub2RlVHlwZT09PTEmJmUhPT10JiZuLnB1c2go +ZSk7cmV0dXJuIG59fSk7dmFyIGN0PSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZh +c3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxo +Z3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1l +fHZpZGVvIixodD0vIGpRdWVyeVxkKz0iKD86bnVsbHxcZCspIi9nLHB0PS9eXHMrLyxkdD0vPCg/ +IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSsp +W14+XSopXC8+L2dpLHZ0PS88KFtcdzpdKykvLG10PS88dGJvZHkvaSxndD0vPHwmIz9cdys7Lyx5 +dD0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLGJ0PS88KD86c2NyaXB0fG9iamVjdHxlbWJlZHxv +cHRpb258c3R5bGUpL2ksd3Q9bmV3IFJlZ0V4cCgiPCg/OiIrY3QrIilbXFxzLz5dIiwiaSIpLEV0 +PS9eKD86Y2hlY2tib3h8cmFkaW8pJC8sU3Q9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tl +ZC4pL2kseHQ9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxUdD0vXlxzKjwhKD86XFtDREFUQVxbfFwt +XC0pfFtcXVwtXXsyfT5ccyokL2csTnQ9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVs +dGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+ +Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIs +IjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Ri +b2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIs +IjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0 +OlswLCIiLCIiXX0sQ3Q9bHQoaSksa3Q9Q3QuYXBwZW5kQ2hpbGQoaS5jcmVhdGVFbGVtZW50KCJk +aXYiKSk7TnQub3B0Z3JvdXA9TnQub3B0aW9uLE50LnRib2R5PU50LnRmb290PU50LmNvbGdyb3Vw +PU50LmNhcHRpb249TnQudGhlYWQsTnQudGg9TnQudGQsdi5zdXBwb3J0Lmh0bWxTZXJpYWxpemV8 +fChOdC5fZGVmYXVsdD1bMSwiWDxkaXY+IiwiPC9kaXY+Il0pLHYuZm4uZXh0ZW5kKHt0ZXh0OmZ1 +bmN0aW9uKGUpe3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dD92 +LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRv +Y3VtZW50fHxpKS5jcmVhdGVUZXh0Tm9kZShlKSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0s +d3JhcEFsbDpmdW5jdGlvbihlKXtpZih2LmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChm +dW5jdGlvbih0KXt2KHRoaXMpLndyYXBBbGwoZS5jYWxsKHRoaXMsdCkpfSk7aWYodGhpc1swXSl7 +dmFyIHQ9dihlLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0u +cGFyZW50Tm9kZSYmdC5pbnNlcnRCZWZvcmUodGhpc1swXSksdC5tYXAoZnVuY3Rpb24oKXt2YXIg +ZT10aGlzO3doaWxlKGUuZmlyc3RDaGlsZCYmZS5maXJzdENoaWxkLm5vZGVUeXBlPT09MSllPWUu +Zmlyc3RDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVy +OmZ1bmN0aW9uKGUpe3JldHVybiB2LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKHQp +e3YodGhpcykud3JhcElubmVyKGUuY2FsbCh0aGlzLHQpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigp +e3ZhciB0PXYodGhpcyksbj10LmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKGUpOnQuYXBw +ZW5kKGUpfSl9LHdyYXA6ZnVuY3Rpb24oZSl7dmFyIHQ9di5pc0Z1bmN0aW9uKGUpO3JldHVybiB0 +aGlzLmVhY2goZnVuY3Rpb24obil7dih0aGlzKS53cmFwQWxsKHQ/ZS5jYWxsKHRoaXMsbik6ZSl9 +KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigp +e3Yubm9kZU5hbWUodGhpcywiYm9keSIpfHx2KHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGRO +b2Rlcyl9KS5lbmQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJn +dW1lbnRzLCEwLGZ1bmN0aW9uKGUpeyh0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09 +PTExKSYmdGhpcy5hcHBlbmRDaGlsZChlKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRo +aXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGUpeyh0aGlzLm5vZGVUeXBlPT09MXx8 +dGhpcy5ub2RlVHlwZT09PTExKSYmdGhpcy5pbnNlcnRCZWZvcmUoZSx0aGlzLmZpcnN0Q2hpbGQp +fSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKCF1dCh0aGlzWzBdKSlyZXR1cm4gdGhpcy5kb21NYW5p +cChhcmd1bWVudHMsITEsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShl +LHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9di5jbGVhbihhcmd1bWVudHMpO3Jl +dHVybiB0aGlzLnB1c2hTdGFjayh2Lm1lcmdlKGUsdGhpcyksImJlZm9yZSIsdGhpcy5zZWxlY3Rv +cil9fSxhZnRlcjpmdW5jdGlvbigpe2lmKCF1dCh0aGlzWzBdKSlyZXR1cm4gdGhpcy5kb21NYW5p +cChhcmd1bWVudHMsITEsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShl +LHRoaXMubmV4dFNpYmxpbmcpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9di5jbGVhbihh +cmd1bWVudHMpO3JldHVybiB0aGlzLnB1c2hTdGFjayh2Lm1lcmdlKHRoaXMsZSksImFmdGVyIix0 +aGlzLnNlbGVjdG9yKX19LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MDtmb3IoOyhuPXRo +aXNbcl0pIT1udWxsO3IrKylpZighZXx8di5maWx0ZXIoZSxbbl0pLmxlbmd0aCkhdCYmbi5ub2Rl +VHlwZT09PTEmJih2LmNsZWFuRGF0YShuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLHYuY2xl +YW5EYXRhKFtuXSkpLG4ucGFyZW50Tm9kZSYmbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pO3Jl +dHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe3ZhciBlLHQ9MDtmb3IoOyhlPXRoaXNbdF0pIT1u +dWxsO3QrKyl7ZS5ub2RlVHlwZT09PTEmJnYuY2xlYW5EYXRhKGUuZ2V0RWxlbWVudHNCeVRhZ05h +bWUoIioiKSk7d2hpbGUoZS5maXJzdENoaWxkKWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKX1y +ZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPT1udWxsPyExOmUsdD10 +PT1udWxsP2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB2LmNsb25lKHRoaXMsZSx0KX0p +fSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3ZhciBu +PXRoaXNbMF18fHt9LHI9MCxpPXRoaXMubGVuZ3RoO2lmKGU9PT10KXJldHVybiBuLm5vZGVUeXBl +PT09MT9uLmlubmVySFRNTC5yZXBsYWNlKGh0LCIiKTp0O2lmKHR5cGVvZiBlPT0ic3RyaW5nIiYm +IXl0LnRlc3QoZSkmJih2LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8IXd0LnRlc3QoZSkpJiYodi5z +dXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlfHwhcHQudGVzdChlKSkmJiFOdFsodnQuZXhlYyhlKXx8 +WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9ZS5yZXBsYWNlKGR0LCI8JDE+PC8kMj4iKTt0 +cnl7Zm9yKDtyPGk7cisrKW49dGhpc1tyXXx8e30sbi5ub2RlVHlwZT09PTEmJih2LmNsZWFuRGF0 +YShuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLG4uaW5uZXJIVE1MPWUpO249MH1jYXRjaChz +KXt9fW4mJnRoaXMuZW1wdHkoKS5hcHBlbmQoZSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0s +cmVwbGFjZVdpdGg6ZnVuY3Rpb24oZSl7cmV0dXJuIHV0KHRoaXNbMF0pP3RoaXMubGVuZ3RoP3Ro +aXMucHVzaFN0YWNrKHYodi5pc0Z1bmN0aW9uKGUpP2UoKTplKSwicmVwbGFjZVdpdGgiLGUpOnRo +aXM6di5pc0Z1bmN0aW9uKGUpP3RoaXMuZWFjaChmdW5jdGlvbih0KXt2YXIgbj12KHRoaXMpLHI9 +bi5odG1sKCk7bi5yZXBsYWNlV2l0aChlLmNhbGwodGhpcyx0LHIpKX0pOih0eXBlb2YgZSE9InN0 +cmluZyImJihlPXYoZSkuZGV0YWNoKCkpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXRoaXMu +bmV4dFNpYmxpbmcsbj10aGlzLnBhcmVudE5vZGU7dih0aGlzKS5yZW1vdmUoKSx0P3YodCkuYmVm +b3JlKGUpOnYobikuYXBwZW5kKGUpfSkpfSxkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMu +cmVtb3ZlKGUsITApfSxkb21NYW5pcDpmdW5jdGlvbihlLG4scil7ZT1bXS5jb25jYXQuYXBwbHko +W10sZSk7dmFyIGkscyxvLHUsYT0wLGY9ZVswXSxsPVtdLGM9dGhpcy5sZW5ndGg7aWYoIXYuc3Vw +cG9ydC5jaGVja0Nsb25lJiZjPjEmJnR5cGVvZiBmPT0ic3RyaW5nIiYmU3QudGVzdChmKSlyZXR1 +cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dih0aGlzKS5kb21NYW5pcChlLG4scil9KTtpZih2Lmlz +RnVuY3Rpb24oZikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXt2YXIgcz12KHRoaXMpO2Vb +MF09Zi5jYWxsKHRoaXMsaSxuP3MuaHRtbCgpOnQpLHMuZG9tTWFuaXAoZSxuLHIpfSk7aWYodGhp +c1swXSl7aT12LmJ1aWxkRnJhZ21lbnQoZSx0aGlzLGwpLG89aS5mcmFnbWVudCxzPW8uZmlyc3RD +aGlsZCxvLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmKG89cyk7aWYocyl7bj1uJiZ2Lm5vZGVOYW1l +KHMsInRyIik7Zm9yKHU9aS5jYWNoZWFibGV8fGMtMTthPGM7YSsrKXIuY2FsbChuJiZ2Lm5vZGVO +YW1lKHRoaXNbYV0sInRhYmxlIik/THQodGhpc1thXSwidGJvZHkiKTp0aGlzW2FdLGE9PT11P286 +di5jbG9uZShvLCEwLCEwKSl9bz1zPW51bGwsbC5sZW5ndGgmJnYuZWFjaChsLGZ1bmN0aW9uKGUs +dCl7dC5zcmM/di5hamF4P3YuYWpheCh7dXJsOnQuc3JjLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNj +cmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSk6di5lcnJvcigibm8gYWpheCIp +OnYuZ2xvYmFsRXZhbCgodC50ZXh0fHx0LnRleHRDb250ZW50fHx0LmlubmVySFRNTHx8IiIpLnJl +cGxhY2UoVHQsIiIpKSx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX0p +fXJldHVybiB0aGlzfX0pLHYuYnVpbGRGcmFnbWVudD1mdW5jdGlvbihlLG4scil7dmFyIHMsbyx1 +LGE9ZVswXTtyZXR1cm4gbj1ufHxpLG49IW4ubm9kZVR5cGUmJm5bMF18fG4sbj1uLm93bmVyRG9j +dW1lbnR8fG4sZS5sZW5ndGg9PT0xJiZ0eXBlb2YgYT09InN0cmluZyImJmEubGVuZ3RoPDUxMiYm +bj09PWkmJmEuY2hhckF0KDApPT09IjwiJiYhYnQudGVzdChhKSYmKHYuc3VwcG9ydC5jaGVja0Ns +b25lfHwhU3QudGVzdChhKSkmJih2LnN1cHBvcnQuaHRtbDVDbG9uZXx8IXd0LnRlc3QoYSkpJiYo +bz0hMCxzPXYuZnJhZ21lbnRzW2FdLHU9cyE9PXQpLHN8fChzPW4uY3JlYXRlRG9jdW1lbnRGcmFn +bWVudCgpLHYuY2xlYW4oZSxuLHMsciksbyYmKHYuZnJhZ21lbnRzW2FdPXUmJnMpKSx7ZnJhZ21l +bnQ6cyxjYWNoZWFibGU6b319LHYuZnJhZ21lbnRzPXt9LHYuZWFjaCh7YXBwZW5kVG86ImFwcGVu +ZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6 +ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGUsdCl7di5mbltlXT1m +dW5jdGlvbihuKXt2YXIgcixpPTAscz1bXSxvPXYobiksdT1vLmxlbmd0aCxhPXRoaXMubGVuZ3Ro +PT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2lmKChhPT1udWxsfHxhJiZhLm5vZGVUeXBlPT09MTEm +JmEuY2hpbGROb2Rlcy5sZW5ndGg9PT0xKSYmdT09PTEpcmV0dXJuIG9bdF0odGhpc1swXSksdGhp +cztmb3IoO2k8dTtpKyspcj0oaT4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpLHYob1tpXSlb +dF0ocikscz1zLmNvbmNhdChyKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socyxlLG8uc2VsZWN0b3Ip +fX0pLHYuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxzLG87di5zdXBwb3J0 +Lmh0bWw1Q2xvbmV8fHYuaXNYTUxEb2MoZSl8fCF3dC50ZXN0KCI8IitlLm5vZGVOYW1lKyI+Iik/ +bz1lLmNsb25lTm9kZSghMCk6KGt0LmlubmVySFRNTD1lLm91dGVySFRNTCxrdC5yZW1vdmVDaGls +ZChvPWt0LmZpcnN0Q2hpbGQpKTtpZigoIXYuc3VwcG9ydC5ub0Nsb25lRXZlbnR8fCF2LnN1cHBv +cnQubm9DbG9uZUNoZWNrZWQpJiYoZS5ub2RlVHlwZT09PTF8fGUubm9kZVR5cGU9PT0xMSkmJiF2 +LmlzWE1MRG9jKGUpKXtPdChlLG8pLHI9TXQoZSksaT1NdChvKTtmb3Iocz0wO3Jbc107KytzKWlb +c10mJk90KHJbc10saVtzXSl9aWYodCl7QXQoZSxvKTtpZihuKXtyPU10KGUpLGk9TXQobyk7Zm9y +KHM9MDtyW3NdOysrcylBdChyW3NdLGlbc10pfX1yZXR1cm4gcj1pPW51bGwsb30sY2xlYW46ZnVu +Y3Rpb24oZSx0LG4scil7dmFyIHMsbyx1LGEsZixsLGMsaCxwLGQsbSxnLHk9dD09PWkmJkN0LGI9 +W107aWYoIXR8fHR5cGVvZiB0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQ9PSJ1bmRlZmluZWQiKXQ9 +aTtmb3Iocz0wOyh1PWVbc10pIT1udWxsO3MrKyl7dHlwZW9mIHU9PSJudW1iZXIiJiYodSs9IiIp +O2lmKCF1KWNvbnRpbnVlO2lmKHR5cGVvZiB1PT0ic3RyaW5nIilpZighZ3QudGVzdCh1KSl1PXQu +Y3JlYXRlVGV4dE5vZGUodSk7ZWxzZXt5PXl8fGx0KHQpLGM9dC5jcmVhdGVFbGVtZW50KCJkaXYi +KSx5LmFwcGVuZENoaWxkKGMpLHU9dS5yZXBsYWNlKGR0LCI8JDE+PC8kMj4iKSxhPSh2dC5leGVj +KHUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGY9TnRbYV18fE50Ll9kZWZhdWx0LGw9Zlsw +XSxjLmlubmVySFRNTD1mWzFdK3UrZlsyXTt3aGlsZShsLS0pYz1jLmxhc3RDaGlsZDtpZighdi5z +dXBwb3J0LnRib2R5KXtoPW10LnRlc3QodSkscD1hPT09InRhYmxlIiYmIWg/Yy5maXJzdENoaWxk +JiZjLmZpcnN0Q2hpbGQuY2hpbGROb2RlczpmWzFdPT09Ijx0YWJsZT4iJiYhaD9jLmNoaWxkTm9k +ZXM6W107Zm9yKG89cC5sZW5ndGgtMTtvPj0wOy0tbyl2Lm5vZGVOYW1lKHBbb10sInRib2R5Iikm +JiFwW29dLmNoaWxkTm9kZXMubGVuZ3RoJiZwW29dLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocFtv +XSl9IXYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmcHQudGVzdCh1KSYmYy5pbnNlcnRCZWZv +cmUodC5jcmVhdGVUZXh0Tm9kZShwdC5leGVjKHUpWzBdKSxjLmZpcnN0Q2hpbGQpLHU9Yy5jaGls +ZE5vZGVzLGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKX11Lm5vZGVUeXBlP2IucHVzaCh1KTp2 +Lm1lcmdlKGIsdSl9YyYmKHU9Yz15PW51bGwpO2lmKCF2LnN1cHBvcnQuYXBwZW5kQ2hlY2tlZClm +b3Iocz0wOyh1PWJbc10pIT1udWxsO3MrKyl2Lm5vZGVOYW1lKHUsImlucHV0Iik/X3QodSk6dHlw +ZW9mIHUuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZ2LmdyZXAodS5nZXRFbGVt +ZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxfdCk7aWYobil7bT1mdW5jdGlvbihlKXtpZighZS50eXBl +fHx4dC50ZXN0KGUudHlwZSkpcmV0dXJuIHI/ci5wdXNoKGUucGFyZW50Tm9kZT9lLnBhcmVudE5v +ZGUucmVtb3ZlQ2hpbGQoZSk6ZSk6bi5hcHBlbmRDaGlsZChlKX07Zm9yKHM9MDsodT1iW3NdKSE9 +bnVsbDtzKyspaWYoIXYubm9kZU5hbWUodSwic2NyaXB0Iil8fCFtKHUpKW4uYXBwZW5kQ2hpbGQo +dSksdHlwZW9mIHUuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiYoZz12LmdyZXAo +di5tZXJnZShbXSx1LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSksbSksYi5zcGxpY2Uu +YXBwbHkoYixbcysxLDBdLmNvbmNhdChnKSkscys9Zy5sZW5ndGgpfXJldHVybiBifSxjbGVhbkRh +dGE6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvPTAsdT12LmV4cGFuZG8sYT12LmNhY2hlLGY9 +di5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8sbD12LmV2ZW50LnNwZWNpYWw7Zm9yKDsoaT1lW29dKSE9 +bnVsbDtvKyspaWYodHx8di5hY2NlcHREYXRhKGkpKXtyPWlbdV0sbj1yJiZhW3JdO2lmKG4pe2lm +KG4uZXZlbnRzKWZvcihzIGluIG4uZXZlbnRzKWxbc10/di5ldmVudC5yZW1vdmUoaSxzKTp2LnJl +bW92ZUV2ZW50KGkscyxuLmhhbmRsZSk7YVtyXSYmKGRlbGV0ZSBhW3JdLGY/ZGVsZXRlIGlbdV06 +aS5yZW1vdmVBdHRyaWJ1dGU/aS5yZW1vdmVBdHRyaWJ1dGUodSk6aVt1XT1udWxsLHYuZGVsZXRl +ZElkcy5wdXNoKHIpKX19fX0pLGZ1bmN0aW9uKCl7dmFyIGUsdDt2LnVhTWF0Y2g9ZnVuY3Rpb24o +ZSl7ZT1lLnRvTG93ZXJDYXNlKCk7dmFyIHQ9LyhjaHJvbWUpWyBcL10oW1x3Ll0rKS8uZXhlYyhl +KXx8Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8uZXhlYyhlKXx8LyhvcGVyYSkoPzouKnZlcnNpb258 +KVsgXC9dKFtcdy5dKykvLmV4ZWMoZSl8fC8obXNpZSkgKFtcdy5dKykvLmV4ZWMoZSl8fGUuaW5k +ZXhPZigiY29tcGF0aWJsZSIpPDAmJi8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKyl8KS8uZXhl +YyhlKXx8W107cmV0dXJue2Jyb3dzZXI6dFsxXXx8IiIsdmVyc2lvbjp0WzJdfHwiMCJ9fSxlPXYu +dWFNYXRjaChvLnVzZXJBZ2VudCksdD17fSxlLmJyb3dzZXImJih0W2UuYnJvd3Nlcl09ITAsdC52 +ZXJzaW9uPWUudmVyc2lvbiksdC5jaHJvbWU/dC53ZWJraXQ9ITA6dC53ZWJraXQmJih0LnNhZmFy +aT0hMCksdi5icm93c2VyPXQsdi5zdWI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbil7cmV0dXJu +IG5ldyBlLmZuLmluaXQodCxuKX12LmV4dGVuZCghMCxlLHRoaXMpLGUuc3VwZXJjbGFzcz10aGlz +LGUuZm49ZS5wcm90b3R5cGU9dGhpcygpLGUuZm4uY29uc3RydWN0b3I9ZSxlLnN1Yj10aGlzLnN1 +YixlLmZuLmluaXQ9ZnVuY3Rpb24ocixpKXtyZXR1cm4gaSYmaSBpbnN0YW5jZW9mIHYmJiEoaSBp +bnN0YW5jZW9mIGUpJiYoaT1lKGkpKSx2LmZuLmluaXQuY2FsbCh0aGlzLHIsaSx0KX0sZS5mbi5p +bml0LnByb3RvdHlwZT1lLmZuO3ZhciB0PWUoaSk7cmV0dXJuIGV9fSgpO3ZhciBEdCxQdCxIdCxC +dD0vYWxwaGFcKFteKV0qXCkvaSxqdD0vb3BhY2l0eT0oW14pXSopLyxGdD0vXih0b3B8cmlnaHR8 +Ym90dG9tfGxlZnQpJC8sSXQ9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLHF0PS9ebWFyZ2lu +LyxSdD1uZXcgUmVnRXhwKCJeKCIrbSsiKSguKikkIiwiaSIpLFV0PW5ldyBSZWdFeHAoIl4oIitt +KyIpKD8hcHgpW2EteiVdKyQiLCJpIiksenQ9bmV3IFJlZ0V4cCgiXihbLStdKT0oIittKyIpIiwi +aSIpLFd0PXtCT0RZOiJibG9jayJ9LFh0PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6 +ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxWdD17bGV0dGVyU3BhY2luZzowLGZvbnRXZWlnaHQ6 +NDAwfSwkdD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLEp0PVsiV2Via2l0IiwiTyIs +Ik1veiIsIm1zIl0sS3Q9di5mbi50b2dnbGU7di5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLG4p +e3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gciE9PXQ/di5zdHls +ZShlLG4scik6di5jc3MoZSxuKX0sZSxuLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rp +b24oKXtyZXR1cm4gWXQodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gWXQodGhpcyl9 +LHRvZ2dsZTpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBlPT0iYm9vbGVhbiI7cmV0dXJuIHYu +aXNGdW5jdGlvbihlKSYmdi5pc0Z1bmN0aW9uKHQpP0t0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0 +aGlzLmVhY2goZnVuY3Rpb24oKXsobj9lOkd0KHRoaXMpKT92KHRoaXMpLnNob3coKTp2KHRoaXMp +LmhpZGUoKX0pfX0pLHYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUs +dCl7aWYodCl7dmFyIG49RHQoZSwib3BhY2l0eSIpO3JldHVybiBuPT09IiI/IjEiOm59fX19LGNz +c051bWJlcjp7ZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNp +dHk6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsi +ZmxvYXQiOnYuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6 +ZnVuY3Rpb24oZSxuLHIsaSl7aWYoIWV8fGUubm9kZVR5cGU9PT0zfHxlLm5vZGVUeXBlPT09OHx8 +IWUuc3R5bGUpcmV0dXJuO3ZhciBzLG8sdSxhPXYuY2FtZWxDYXNlKG4pLGY9ZS5zdHlsZTtuPXYu +Y3NzUHJvcHNbYV18fCh2LmNzc1Byb3BzW2FdPVF0KGYsYSkpLHU9di5jc3NIb29rc1tuXXx8di5j +c3NIb29rc1thXTtpZihyPT09dClyZXR1cm4gdSYmImdldCJpbiB1JiYocz11LmdldChlLCExLGkp +KSE9PXQ/czpmW25dO289dHlwZW9mIHIsbz09PSJzdHJpbmciJiYocz16dC5leGVjKHIpKSYmKHI9 +KHNbMV0rMSkqc1syXStwYXJzZUZsb2F0KHYuY3NzKGUsbikpLG89Im51bWJlciIpO2lmKHI9PW51 +bGx8fG89PT0ibnVtYmVyIiYmaXNOYU4ocikpcmV0dXJuO289PT0ibnVtYmVyIiYmIXYuY3NzTnVt +YmVyW2FdJiYocis9InB4Iik7aWYoIXV8fCEoInNldCJpbiB1KXx8KHI9dS5zZXQoZSxyLGkpKSE9 +PXQpdHJ5e2Zbbl09cn1jYXRjaChsKXt9fSxjc3M6ZnVuY3Rpb24oZSxuLHIsaSl7dmFyIHMsbyx1 +LGE9di5jYW1lbENhc2Uobik7cmV0dXJuIG49di5jc3NQcm9wc1thXXx8KHYuY3NzUHJvcHNbYV09 +UXQoZS5zdHlsZSxhKSksdT12LmNzc0hvb2tzW25dfHx2LmNzc0hvb2tzW2FdLHUmJiJnZXQiaW4g +dSYmKHM9dS5nZXQoZSwhMCxpKSkscz09PXQmJihzPUR0KGUsbikpLHM9PT0ibm9ybWFsIiYmbiBp +biBWdCYmKHM9VnRbbl0pLHJ8fGkhPT10PyhvPXBhcnNlRmxvYXQocykscnx8di5pc051bWVyaWMo +byk/b3x8MDpzKTpzfSxzd2FwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHM9e307Zm9yKGkgaW4g +dClzW2ldPWUuc3R5bGVbaV0sZS5zdHlsZVtpXT10W2ldO3I9bi5jYWxsKGUpO2ZvcihpIGluIHQp +ZS5zdHlsZVtpXT1zW2ldO3JldHVybiByfX0pLGUuZ2V0Q29tcHV0ZWRTdHlsZT9EdD1mdW5jdGlv +bih0LG4pe3ZhciByLGkscyxvLHU9ZS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCksYT10LnN0eWxl +O3JldHVybiB1JiYocj11LmdldFByb3BlcnR5VmFsdWUobil8fHVbbl0scj09PSIiJiYhdi5jb250 +YWlucyh0Lm93bmVyRG9jdW1lbnQsdCkmJihyPXYuc3R5bGUodCxuKSksVXQudGVzdChyKSYmcXQu +dGVzdChuKSYmKGk9YS53aWR0aCxzPWEubWluV2lkdGgsbz1hLm1heFdpZHRoLGEubWluV2lkdGg9 +YS5tYXhXaWR0aD1hLndpZHRoPXIscj11LndpZHRoLGEud2lkdGg9aSxhLm1pbldpZHRoPXMsYS5t +YXhXaWR0aD1vKSkscn06aS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoRHQ9ZnVuY3Rp +b24oZSx0KXt2YXIgbixyLGk9ZS5jdXJyZW50U3R5bGUmJmUuY3VycmVudFN0eWxlW3RdLHM9ZS5z +dHlsZTtyZXR1cm4gaT09bnVsbCYmcyYmc1t0XSYmKGk9c1t0XSksVXQudGVzdChpKSYmIUZ0LnRl +c3QodCkmJihuPXMubGVmdCxyPWUucnVudGltZVN0eWxlJiZlLnJ1bnRpbWVTdHlsZS5sZWZ0LHIm +JihlLnJ1bnRpbWVTdHlsZS5sZWZ0PWUuY3VycmVudFN0eWxlLmxlZnQpLHMubGVmdD10PT09ImZv +bnRTaXplIj8iMWVtIjppLGk9cy5waXhlbExlZnQrInB4IixzLmxlZnQ9bixyJiYoZS5ydW50aW1l +U3R5bGUubGVmdD1yKSksaT09PSIiPyJhdXRvIjppfSksdi5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgi +XSxmdW5jdGlvbihlLHQpe3YuY3NzSG9va3NbdF09e2dldDpmdW5jdGlvbihlLG4scil7aWYobily +ZXR1cm4gZS5vZmZzZXRXaWR0aD09PTAmJkl0LnRlc3QoRHQoZSwiZGlzcGxheSIpKT92LnN3YXAo +ZSxYdCxmdW5jdGlvbigpe3JldHVybiB0bihlLHQscil9KTp0bihlLHQscil9LHNldDpmdW5jdGlv +bihlLG4scil7cmV0dXJuIFp0KGUsbixyP2VuKGUsdCxyLHYuc3VwcG9ydC5ib3hTaXppbmcmJnYu +Y3NzKGUsImJveFNpemluZyIpPT09ImJvcmRlci1ib3giKTowKX19fSksdi5zdXBwb3J0Lm9wYWNp +dHl8fCh2LmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihlLHQpe3JldHVybiBqdC50ZXN0 +KCh0JiZlLmN1cnJlbnRTdHlsZT9lLmN1cnJlbnRTdHlsZS5maWx0ZXI6ZS5zdHlsZS5maWx0ZXIp +fHwiIik/LjAxKnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsiIjp0PyIxIjoiIn0sc2V0OmZ1bmN0aW9u +KGUsdCl7dmFyIG49ZS5zdHlsZSxyPWUuY3VycmVudFN0eWxlLGk9di5pc051bWVyaWModCk/ImFs +cGhhKG9wYWNpdHk9Iit0KjEwMCsiKSI6IiIscz1yJiZyLmZpbHRlcnx8bi5maWx0ZXJ8fCIiO24u +em9vbT0xO2lmKHQ+PTEmJnYudHJpbShzLnJlcGxhY2UoQnQsIiIpKT09PSIiJiZuLnJlbW92ZUF0 +dHJpYnV0ZSl7bi5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO2lmKHImJiFyLmZpbHRlcilyZXR1 +cm59bi5maWx0ZXI9QnQudGVzdChzKT9zLnJlcGxhY2UoQnQsaSk6cysiICIraX19KSx2KGZ1bmN0 +aW9uKCl7di5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fCh2LmNzc0hvb2tzLm1hcmdpblJp +Z2h0PXtnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdi5zd2FwKGUse2Rpc3BsYXk6ImlubGluZS1i +bG9jayJ9LGZ1bmN0aW9uKCl7aWYodClyZXR1cm4gRHQoZSwibWFyZ2luUmlnaHQiKX0pfX0pLCF2 +LnN1cHBvcnQucGl4ZWxQb3NpdGlvbiYmdi5mbi5wb3NpdGlvbiYmdi5lYWNoKFsidG9wIiwibGVm +dCJdLGZ1bmN0aW9uKGUsdCl7di5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbil7aWYobil7 +dmFyIHI9RHQoZSx0KTtyZXR1cm4gVXQudGVzdChyKT92KGUpLnBvc2l0aW9uKClbdF0rInB4Ijpy +fX19fSl9KSx2LmV4cHImJnYuZXhwci5maWx0ZXJzJiYodi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1 +bmN0aW9uKGUpe3JldHVybiBlLm9mZnNldFdpZHRoPT09MCYmZS5vZmZzZXRIZWlnaHQ9PT0wfHwh +di5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmKGUuc3R5bGUmJmUuc3R5bGUuZGlzcGxh +eXx8RHQoZSwiZGlzcGxheSIpKT09PSJub25lIn0sdi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5j +dGlvbihlKXtyZXR1cm4hdi5leHByLmZpbHRlcnMuaGlkZGVuKGUpfSksdi5lYWNoKHttYXJnaW46 +IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oZSx0KXt2LmNzc0hvb2tzW2Ur +dF09e2V4cGFuZDpmdW5jdGlvbihuKXt2YXIgcixpPXR5cGVvZiBuPT0ic3RyaW5nIj9uLnNwbGl0 +KCIgIik6W25dLHM9e307Zm9yKHI9MDtyPDQ7cisrKXNbZSskdFtyXSt0XT1pW3JdfHxpW3ItMl18 +fGlbMF07cmV0dXJuIHN9fSxxdC50ZXN0KGUpfHwodi5jc3NIb29rc1tlK3RdLnNldD1adCl9KTt2 +YXIgcm49LyUyMC9nLHNuPS9cW1xdJC8sb249L1xyP1xuL2csdW49L14oPzpjb2xvcnxkYXRlfGRh +dGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8 +cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGFuPS9eKD86c2VsZWN0fHRl +eHRhcmVhKS9pO3YuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdi5wYXJh +bSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVy +biB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP3YubWFrZUFycmF5KHRo +aXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYh +dGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8YW4udGVzdCh0aGlzLm5vZGVOYW1lKXx8dW4u +dGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPXYodGhpcykudmFsKCk7 +cmV0dXJuIG49PW51bGw/bnVsbDp2LmlzQXJyYXkobik/di5tYXAobixmdW5jdGlvbihlLG4pe3Jl +dHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2Uob24sIlxyXG4iKX19KTp7bmFtZTp0Lm5h +bWUsdmFsdWU6bi5yZXBsYWNlKG9uLCJcclxuIil9fSkuZ2V0KCl9fSksdi5wYXJhbT1mdW5jdGlv +bihlLG4pe3ZhciByLGk9W10scz1mdW5jdGlvbihlLHQpe3Q9di5pc0Z1bmN0aW9uKHQpP3QoKTp0 +PT1udWxsPyIiOnQsaVtpLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVV +UklDb21wb25lbnQodCl9O249PT10JiYobj12LmFqYXhTZXR0aW5ncyYmdi5hamF4U2V0dGluZ3Mu +dHJhZGl0aW9uYWwpO2lmKHYuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF2LmlzUGxhaW5PYmplY3Qo +ZSkpdi5lYWNoKGUsZnVuY3Rpb24oKXtzKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9y +KHIgaW4gZSlmbihyLGVbcl0sbixzKTtyZXR1cm4gaS5qb2luKCImIikucmVwbGFjZShybiwiKyIp +fTt2YXIgbG4sY24saG49LyMuKiQvLHBuPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcs +ZG49L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lk +Z2V0KTokLyx2bj0vXig/OkdFVHxIRUFEKSQvLG1uPS9eXC9cLy8sZ249L1w/Lyx5bj0vPHNjcmlw +dFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxibj0vKFs/Jl0p +Xz1bXiZdKi8sd249L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKXwp +fCkvLEVuPXYuZm4ubG9hZCxTbj17fSx4bj17fSxUbj1bIiovIl0rWyIqIl07dHJ5e2NuPXMuaHJl +Zn1jYXRjaChObil7Y249aS5jcmVhdGVFbGVtZW50KCJhIiksY24uaHJlZj0iIixjbj1jbi5ocmVm +fWxuPXduLmV4ZWMoY24udG9Mb3dlckNhc2UoKSl8fFtdLHYuZm4ubG9hZD1mdW5jdGlvbihlLG4s +cil7aWYodHlwZW9mIGUhPSJzdHJpbmciJiZFbilyZXR1cm4gRW4uYXBwbHkodGhpcyxhcmd1bWVu +dHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgaSxzLG8sdT10aGlzLGE9ZS5pbmRl +eE9mKCIgIik7cmV0dXJuIGE+PTAmJihpPWUuc2xpY2UoYSxlLmxlbmd0aCksZT1lLnNsaWNlKDAs +YSkpLHYuaXNGdW5jdGlvbihuKT8ocj1uLG49dCk6biYmdHlwZW9mIG49PSJvYmplY3QiJiYocz0i +UE9TVCIpLHYuYWpheCh7dXJsOmUsdHlwZTpzLGRhdGFUeXBlOiJodG1sIixkYXRhOm4sY29tcGxl +dGU6ZnVuY3Rpb24oZSx0KXtyJiZ1LmVhY2gocixvfHxbZS5yZXNwb25zZVRleHQsdCxlXSl9fSku +ZG9uZShmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyx1Lmh0bWwoaT92KCI8ZGl2PiIpLmFwcGVuZChl +LnJlcGxhY2UoeW4sIiIpKS5maW5kKGkpOmUpfSksdGhpc30sdi5lYWNoKCJhamF4U3RhcnQgYWph +eFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQo +IiAiKSxmdW5jdGlvbihlLHQpe3YuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxl +KX19KSx2LmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxuKXt2W25dPWZ1bmN0aW9uKGUs +cixpLHMpe3JldHVybiB2LmlzRnVuY3Rpb24ocikmJihzPXN8fGksaT1yLHI9dCksdi5hamF4KHt0 +eXBlOm4sdXJsOmUsZGF0YTpyLHN1Y2Nlc3M6aSxkYXRhVHlwZTpzfSl9fSksdi5leHRlbmQoe2dl +dFNjcmlwdDpmdW5jdGlvbihlLG4pe3JldHVybiB2LmdldChlLHQsbiwic2NyaXB0Iil9LGdldEpT +T046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2LmdldChlLHQsbiwianNvbiIpfSxhamF4U2V0dXA6 +ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9MbihlLHYuYWpheFNldHRpbmdzKToodD1lLGU9di5hamF4 +U2V0dGluZ3MpLExuKGUsdCksZX0sYWpheFNldHRpbmdzOnt1cmw6Y24saXNMb2NhbDpkbi50ZXN0 +KGxuWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13 +d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Iixwcm9jZXNzRGF0YTohMCxhc3luYzoh +MCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRt +bCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2Ny +aXB0IiwiKiI6VG59LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99 +LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxj +b252ZXJ0ZXJzOnsiKiB0ZXh0IjplLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjp2 +LnBhcnNlSlNPTiwidGV4dCB4bWwiOnYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEw +LHVybDohMH19LGFqYXhQcmVmaWx0ZXI6Q24oU24pLGFqYXhUcmFuc3BvcnQ6Q24oeG4pLGFqYXg6 +ZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBUKGUsbixzLGEpe3ZhciBsLHksYix3LFMsVD1uO2lmKEU9 +PT0yKXJldHVybjtFPTIsdSYmY2xlYXJUaW1lb3V0KHUpLG89dCxpPWF8fCIiLHgucmVhZHlTdGF0 +ZT1lPjA/NDowLHMmJih3PUFuKGMseCxzKSk7aWYoZT49MjAwJiZlPDMwMHx8ZT09PTMwNCljLmlm +TW9kaWZpZWQmJihTPXguZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxTJiYodi5s +YXN0TW9kaWZpZWRbcl09UyksUz14LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIiksUyYmKHYuZXRh +Z1tyXT1TKSksZT09PTMwND8oVD0ibm90bW9kaWZpZWQiLGw9ITApOihsPU9uKGMsdyksVD1sLnN0 +YXRlLHk9bC5kYXRhLGI9bC5lcnJvcixsPSFiKTtlbHNle2I9VDtpZighVHx8ZSlUPSJlcnJvciIs +ZTwwJiYoZT0wKX14LnN0YXR1cz1lLHguc3RhdHVzVGV4dD0obnx8VCkrIiIsbD9kLnJlc29sdmVX +aXRoKGgsW3ksVCx4XSk6ZC5yZWplY3RXaXRoKGgsW3gsVCxiXSkseC5zdGF0dXNDb2RlKGcpLGc9 +dCxmJiZwLnRyaWdnZXIoImFqYXgiKyhsPyJTdWNjZXNzIjoiRXJyb3IiKSxbeCxjLGw/eTpiXSks +bS5maXJlV2l0aChoLFt4LFRdKSxmJiYocC50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt4LGNdKSwt +LXYuYWN0aXZlfHx2LmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfXR5cGVvZiBlPT0ib2JqZWN0 +IiYmKG49ZSxlPXQpLG49bnx8e307dmFyIHIsaSxzLG8sdSxhLGYsbCxjPXYuYWpheFNldHVwKHt9 +LG4pLGg9Yy5jb250ZXh0fHxjLHA9aCE9PWMmJihoLm5vZGVUeXBlfHxoIGluc3RhbmNlb2Ygdik/ +dihoKTp2LmV2ZW50LGQ9di5EZWZlcnJlZCgpLG09di5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiks +Zz1jLnN0YXR1c0NvZGV8fHt9LGI9e30sdz17fSxFPTAsUz0iY2FuY2VsZWQiLHg9e3JlYWR5U3Rh +dGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7aWYoIUUpe3ZhciBuPWUudG9Mb3dl +ckNhc2UoKTtlPXdbbl09d1tuXXx8ZSxiW2VdPXR9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNl +SGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBFPT09Mj9pOm51bGx9LGdldFJlc3BvbnNlSGVhZGVy +OmZ1bmN0aW9uKGUpe3ZhciBuO2lmKEU9PT0yKXtpZighcyl7cz17fTt3aGlsZShuPXBuLmV4ZWMo +aSkpc1tuWzFdLnRvTG93ZXJDYXNlKCldPW5bMl19bj1zW2UudG9Mb3dlckNhc2UoKV19cmV0dXJu +IG49PT10P251bGw6bn0sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gRXx8KGMu +bWltZVR5cGU9ZSksdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZXx8UyxvJiZvLmFi +b3J0KGUpLFQoMCxlKSx0aGlzfX07ZC5wcm9taXNlKHgpLHguc3VjY2Vzcz14LmRvbmUseC5lcnJv +cj14LmZhaWwseC5jb21wbGV0ZT1tLmFkZCx4LnN0YXR1c0NvZGU9ZnVuY3Rpb24oZSl7aWYoZSl7 +dmFyIHQ7aWYoRTwyKWZvcih0IGluIGUpZ1t0XT1bZ1t0XSxlW3RdXTtlbHNlIHQ9ZVt4LnN0YXR1 +c10seC5hbHdheXModCl9cmV0dXJuIHRoaXN9LGMudXJsPSgoZXx8Yy51cmwpKyIiKS5yZXBsYWNl +KGhuLCIiKS5yZXBsYWNlKG1uLGxuWzFdKyIvLyIpLGMuZGF0YVR5cGVzPXYudHJpbShjLmRhdGFU +eXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoeSksYy5jcm9zc0RvbWFpbj09bnVsbCYmKGE9 +d24uZXhlYyhjLnVybC50b0xvd2VyQ2FzZSgpKSxjLmNyb3NzRG9tYWluPSEoIWF8fGFbMV09PT1s +blsxXSYmYVsyXT09PWxuWzJdJiYoYVszXXx8KGFbMV09PT0iaHR0cDoiPzgwOjQ0MykpPT0obG5b +M118fChsblsxXT09PSJodHRwOiI/ODA6NDQzKSkpKSxjLmRhdGEmJmMucHJvY2Vzc0RhdGEmJnR5 +cGVvZiBjLmRhdGEhPSJzdHJpbmciJiYoYy5kYXRhPXYucGFyYW0oYy5kYXRhLGMudHJhZGl0aW9u +YWwpKSxrbihTbixjLG4seCk7aWYoRT09PTIpcmV0dXJuIHg7Zj1jLmdsb2JhbCxjLnR5cGU9Yy50 +eXBlLnRvVXBwZXJDYXNlKCksYy5oYXNDb250ZW50PSF2bi50ZXN0KGMudHlwZSksZiYmdi5hY3Rp +dmUrKz09PTAmJnYuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7aWYoIWMuaGFzQ29udGVudCl7 +Yy5kYXRhJiYoYy51cmwrPShnbi50ZXN0KGMudXJsKT8iJiI6Ij8iKStjLmRhdGEsZGVsZXRlIGMu +ZGF0YSkscj1jLnVybDtpZihjLmNhY2hlPT09ITEpe3ZhciBOPXYubm93KCksQz1jLnVybC5yZXBs +YWNlKGJuLCIkMV89IitOKTtjLnVybD1DKyhDPT09Yy51cmw/KGduLnRlc3QoYy51cmwpPyImIjoi +PyIpKyJfPSIrTjoiIil9fShjLmRhdGEmJmMuaGFzQ29udGVudCYmYy5jb250ZW50VHlwZSE9PSEx +fHxuLmNvbnRlbnRUeXBlKSYmeC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGMuY29u +dGVudFR5cGUpLGMuaWZNb2RpZmllZCYmKHI9cnx8Yy51cmwsdi5sYXN0TW9kaWZpZWRbcl0mJngu +c2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHYubGFzdE1vZGlmaWVkW3JdKSx2 +LmV0YWdbcl0mJnguc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsdi5ldGFnW3JdKSks +eC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGMuZGF0YVR5cGVzWzBdJiZjLmFjY2VwdHNbYy5k +YXRhVHlwZXNbMF1dP2MuYWNjZXB0c1tjLmRhdGFUeXBlc1swXV0rKGMuZGF0YVR5cGVzWzBdIT09 +IioiPyIsICIrVG4rIjsgcT0wLjAxIjoiIik6Yy5hY2NlcHRzWyIqIl0pO2ZvcihsIGluIGMuaGVh +ZGVycyl4LnNldFJlcXVlc3RIZWFkZXIobCxjLmhlYWRlcnNbbF0pO2lmKCFjLmJlZm9yZVNlbmR8 +fGMuYmVmb3JlU2VuZC5jYWxsKGgseCxjKSE9PSExJiZFIT09Mil7Uz0iYWJvcnQiO2ZvcihsIGlu +e3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXhbbF0oY1tsXSk7bz1rbih4bixjLG4seCk7 +aWYoIW8pVCgtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt4LnJlYWR5U3RhdGU9MSxmJiZwLnRyaWdn +ZXIoImFqYXhTZW5kIixbeCxjXSksYy5hc3luYyYmYy50aW1lb3V0PjAmJih1PXNldFRpbWVvdXQo +ZnVuY3Rpb24oKXt4LmFib3J0KCJ0aW1lb3V0Iil9LGMudGltZW91dCkpO3RyeXtFPTEsby5zZW5k +KGIsVCl9Y2F0Y2goayl7aWYoIShFPDIpKXRocm93IGs7VCgtMSxrKX19cmV0dXJuIHh9cmV0dXJu +IHguYWJvcnQoKX0sYWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgTW49W10s +X249L1w/LyxEbj0vKD0pXD8oPz0mfCQpfFw/XD8vLFBuPXYubm93KCk7di5hamF4U2V0dXAoe2pz +b25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPU1uLnBvcCgpfHx2 +LmV4cGFuZG8rIl8iK1BuKys7cmV0dXJuIHRoaXNbZV09ITAsZX19KSx2LmFqYXhQcmVmaWx0ZXIo +Impzb24ganNvbnAiLGZ1bmN0aW9uKG4scixpKXt2YXIgcyxvLHUsYT1uLmRhdGEsZj1uLnVybCxs +PW4uanNvbnAhPT0hMSxjPWwmJkRuLnRlc3QoZiksaD1sJiYhYyYmdHlwZW9mIGE9PSJzdHJpbmci +JiYhKG4uY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVy +bGVuY29kZWQiKSYmRG4udGVzdChhKTtpZihuLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGN8fGgp +cmV0dXJuIHM9bi5qc29ucENhbGxiYWNrPXYuaXNGdW5jdGlvbihuLmpzb25wQ2FsbGJhY2spP24u +anNvbnBDYWxsYmFjaygpOm4uanNvbnBDYWxsYmFjayxvPWVbc10sYz9uLnVybD1mLnJlcGxhY2Uo +RG4sIiQxIitzKTpoP24uZGF0YT1hLnJlcGxhY2UoRG4sIiQxIitzKTpsJiYobi51cmwrPShfbi50 +ZXN0KGYpPyImIjoiPyIpK24uanNvbnArIj0iK3MpLG4uY29udmVydGVyc1sic2NyaXB0IGpzb24i +XT1mdW5jdGlvbigpe3JldHVybiB1fHx2LmVycm9yKHMrIiB3YXMgbm90IGNhbGxlZCIpLHVbMF19 +LG4uZGF0YVR5cGVzWzBdPSJqc29uIixlW3NdPWZ1bmN0aW9uKCl7dT1hcmd1bWVudHN9LGkuYWx3 +YXlzKGZ1bmN0aW9uKCl7ZVtzXT1vLG5bc10mJihuLmpzb25wQ2FsbGJhY2s9ci5qc29ucENhbGxi +YWNrLE1uLnB1c2gocykpLHUmJnYuaXNGdW5jdGlvbihvKSYmbyh1WzBdKSx1PW89dH0pLCJzY3Jp +cHQifSksdi5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBs +aWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94 +LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxj +b252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGUpe3JldHVybiB2Lmdsb2JhbEV2YWwo +ZSksZX19fSksdi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2UuY2FjaGU9PT10 +JiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIixlLmdsb2JhbD0hMSl9 +KSx2LmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oZSl7aWYoZS5jcm9zc0RvbWFpbil7 +dmFyIG4scj1pLmhlYWR8fGkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8aS5kb2N1 +bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24ocyxvKXtuPWkuY3JlYXRlRWxlbWVudCgi +c2NyaXB0Iiksbi5hc3luYz0iYXN5bmMiLGUuc2NyaXB0Q2hhcnNldCYmKG4uY2hhcnNldD1lLnNj +cmlwdENoYXJzZXQpLG4uc3JjPWUudXJsLG4ub25sb2FkPW4ub25yZWFkeXN0YXRlY2hhbmdlPWZ1 +bmN0aW9uKGUsaSl7aWYoaXx8IW4ucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChu +LnJlYWR5U3RhdGUpKW4ub25sb2FkPW4ub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsciYmbi5wYXJl +bnROb2RlJiZyLnJlbW92ZUNoaWxkKG4pLG49dCxpfHxvKDIwMCwic3VjY2VzcyIpfSxyLmluc2Vy +dEJlZm9yZShuLHIuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbi5vbmxvYWQoMCwx +KX19fX0pO3ZhciBIbixCbj1lLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4g +SG4pSG5bZV0oMCwxKX06ITEsam49MDt2LmFqYXhTZXR0aW5ncy54aHI9ZS5BY3RpdmVYT2JqZWN0 +P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmRm4oKXx8SW4oKX06Rm4sZnVuY3Rpb24o +ZSl7di5leHRlbmQodi5zdXBwb3J0LHthamF4OiEhZSxjb3JzOiEhZSYmIndpdGhDcmVkZW50aWFs +cyJpbiBlfSl9KHYuYWpheFNldHRpbmdzLnhocigpKSx2LnN1cHBvcnQuYWpheCYmdi5hamF4VHJh +bnNwb3J0KGZ1bmN0aW9uKG4pe2lmKCFuLmNyb3NzRG9tYWlufHx2LnN1cHBvcnQuY29ycyl7dmFy +IHI7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oaSxzKXt2YXIgbyx1LGE9bi54aHIoKTtuLnVzZXJuYW1l +P2Eub3BlbihuLnR5cGUsbi51cmwsbi5hc3luYyxuLnVzZXJuYW1lLG4ucGFzc3dvcmQpOmEub3Bl +bihuLnR5cGUsbi51cmwsbi5hc3luYyk7aWYobi54aHJGaWVsZHMpZm9yKHUgaW4gbi54aHJGaWVs +ZHMpYVt1XT1uLnhockZpZWxkc1t1XTtuLm1pbWVUeXBlJiZhLm92ZXJyaWRlTWltZVR5cGUmJmEu +b3ZlcnJpZGVNaW1lVHlwZShuLm1pbWVUeXBlKSwhbi5jcm9zc0RvbWFpbiYmIWlbIlgtUmVxdWVz +dGVkLVdpdGgiXSYmKGlbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7 +Zm9yKHUgaW4gaSlhLnNldFJlcXVlc3RIZWFkZXIodSxpW3VdKX1jYXRjaChmKXt9YS5zZW5kKG4u +aGFzQ29udGVudCYmbi5kYXRhfHxudWxsKSxyPWZ1bmN0aW9uKGUsaSl7dmFyIHUsZixsLGMsaDt0 +cnl7aWYociYmKGl8fGEucmVhZHlTdGF0ZT09PTQpKXtyPXQsbyYmKGEub25yZWFkeXN0YXRlY2hh +bmdlPXYubm9vcCxCbiYmZGVsZXRlIEhuW29dKTtpZihpKWEucmVhZHlTdGF0ZSE9PTQmJmEuYWJv +cnQoKTtlbHNle3U9YS5zdGF0dXMsbD1hLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLGM9e30saD1h +LnJlc3BvbnNlWE1MLGgmJmguZG9jdW1lbnRFbGVtZW50JiYoYy54bWw9aCk7dHJ5e2MudGV4dD1h +LnJlc3BvbnNlVGV4dH1jYXRjaChwKXt9dHJ5e2Y9YS5zdGF0dXNUZXh0fWNhdGNoKHApe2Y9IiJ9 +IXUmJm4uaXNMb2NhbCYmIW4uY3Jvc3NEb21haW4/dT1jLnRleHQ/MjAwOjQwNDp1PT09MTIyMyYm +KHU9MjA0KX19fWNhdGNoKGQpe2l8fHMoLTEsZCl9YyYmcyh1LGYsYyxsKX0sbi5hc3luYz9hLnJl +YWR5U3RhdGU9PT00P3NldFRpbWVvdXQociwwKToobz0rK2puLEJuJiYoSG58fChIbj17fSx2KGUp +LnVubG9hZChCbikpLEhuW29dPXIpLGEub25yZWFkeXN0YXRlY2hhbmdlPXIpOnIoKX0sYWJvcnQ6 +ZnVuY3Rpb24oKXtyJiZyKDAsMSl9fX19KTt2YXIgcW4sUm4sVW49L14oPzp0b2dnbGV8c2hvd3xo +aWRlKSQvLHpuPW5ldyBSZWdFeHAoIl4oPzooWy0rXSk9fCkoIittKyIpKFthLXolXSopJCIsImki +KSxXbj0vcXVldWVIb29rcyQvLFhuPVtHbl0sVm49eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbixy +LGk9dGhpcy5jcmVhdGVUd2VlbihlLHQpLHM9em4uZXhlYyh0KSxvPWkuY3VyKCksdT0rb3x8MCxh +PTEsZj0yMDtpZihzKXtuPStzWzJdLHI9c1szXXx8KHYuY3NzTnVtYmVyW2VdPyIiOiJweCIpO2lm +KHIhPT0icHgiJiZ1KXt1PXYuY3NzKGkuZWxlbSxlLCEwKXx8bnx8MTtkbyBhPWF8fCIuNSIsdS89 +YSx2LnN0eWxlKGkuZWxlbSxlLHUrcik7d2hpbGUoYSE9PShhPWkuY3VyKCkvbykmJmEhPT0xJiYt +LWYpfWkudW5pdD1yLGkuc3RhcnQ9dSxpLmVuZD1zWzFdP3UrKHNbMV0rMSkqbjpufXJldHVybiBp +fV19O3YuQW5pbWF0aW9uPXYuZXh0ZW5kKEtuLHt0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7di5pc0Z1 +bmN0aW9uKGUpPyh0PWUsZT1bIioiXSk6ZT1lLnNwbGl0KCIgIik7dmFyIG4scj0wLGk9ZS5sZW5n +dGg7Zm9yKDtyPGk7cisrKW49ZVtyXSxWbltuXT1WbltuXXx8W10sVm5bbl0udW5zaGlmdCh0KX0s +cHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9Ybi51bnNoaWZ0KGUpOlhuLnB1c2goZSl9fSksdi5U +d2Vlbj1ZbixZbi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlluLGluaXQ6ZnVuY3Rpb24oZSx0LG4s +cixpLHMpe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fCJzd2luZyIsdGhp +cy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhp +cy51bml0PXN8fCh2LmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9 +WW4ucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOlluLnBy +b3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihlKXt2YXIgdCxuPVluLnBy +b3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9 +dD12LmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhp +cy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz10PWUsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMu +c3RhcnQpKnQrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAu +Y2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6WW4ucHJv +cEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sWW4ucHJvdG90eXBlLmluaXQucHJvdG90 +eXBlPVluLnByb3RvdHlwZSxZbi5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oZSl7 +dmFyIHQ7cmV0dXJuIGUuZWxlbVtlLnByb3BdPT1udWxsfHwhIWUuZWxlbS5zdHlsZSYmZS5lbGVt +LnN0eWxlW2UucHJvcF0hPW51bGw/KHQ9di5jc3MoZS5lbGVtLGUucHJvcCwhMSwiIiksIXR8fHQ9 +PT0iYXV0byI/MDp0KTplLmVsZW1bZS5wcm9wXX0sc2V0OmZ1bmN0aW9uKGUpe3YuZnguc3RlcFtl +LnByb3BdP3YuZnguc3RlcFtlLnByb3BdKGUpOmUuZWxlbS5zdHlsZSYmKGUuZWxlbS5zdHlsZVt2 +LmNzc1Byb3BzW2UucHJvcF1dIT1udWxsfHx2LmNzc0hvb2tzW2UucHJvcF0pP3Yuc3R5bGUoZS5l +bGVtLGUucHJvcCxlLm5vdytlLnVuaXQpOmUuZWxlbVtlLnByb3BdPWUubm93fX19LFluLnByb3BI +b29rcy5zY3JvbGxUb3A9WW4ucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihlKXtl +LmVsZW0ubm9kZVR5cGUmJmUuZWxlbS5wYXJlbnROb2RlJiYoZS5lbGVtW2UucHJvcF09ZS5ub3cp +fX0sdi5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHQpe3ZhciBuPXYu +Zm5bdF07di5mblt0XT1mdW5jdGlvbihyLGkscyl7cmV0dXJuIHI9PW51bGx8fHR5cGVvZiByPT0i +Ym9vbGVhbiJ8fCFlJiZ2LmlzRnVuY3Rpb24ocikmJnYuaXNGdW5jdGlvbihpKT9uLmFwcGx5KHRo +aXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoWm4odCwhMCkscixpLHMpfX0pLHYuZm4uZXh0ZW5k +KHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKEd0KS5jc3MoIm9w +YWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0 +ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT12LmlzRW1wdHlPYmplY3QoZSkscz12LnNwZWVkKHQs +bixyKSxvPWZ1bmN0aW9uKCl7dmFyIHQ9S24odGhpcyx2LmV4dGVuZCh7fSxlKSxzKTtpJiZ0LnN0 +b3AoITApfTtyZXR1cm4gaXx8cy5xdWV1ZT09PSExP3RoaXMuZWFjaChvKTp0aGlzLnF1ZXVlKHMu +cXVldWUsbyl9LHN0b3A6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPWZ1bmN0aW9uKGUpe3ZhciB0PWUu +c3RvcDtkZWxldGUgZS5zdG9wLHQocil9O3JldHVybiB0eXBlb2YgZSE9InN0cmluZyImJihyPW4s +bj1lLGU9dCksbiYmZSE9PSExJiZ0aGlzLnF1ZXVlKGV8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5j +dGlvbigpe3ZhciB0PSEwLG49ZSE9bnVsbCYmZSsicXVldWVIb29rcyIscz12LnRpbWVycyxvPXYu +X2RhdGEodGhpcyk7aWYobilvW25dJiZvW25dLnN0b3AmJmkob1tuXSk7ZWxzZSBmb3IobiBpbiBv +KW9bbl0mJm9bbl0uc3RvcCYmV24udGVzdChuKSYmaShvW25dKTtmb3Iobj1zLmxlbmd0aDtuLS07 +KXNbbl0uZWxlbT09PXRoaXMmJihlPT1udWxsfHxzW25dLnF1ZXVlPT09ZSkmJihzW25dLmFuaW0u +c3RvcChyKSx0PSExLHMuc3BsaWNlKG4sMSkpOyh0fHwhcikmJnYuZGVxdWV1ZSh0aGlzLGUpfSl9 +fSksdi5lYWNoKHtzbGlkZURvd246Wm4oInNob3ciKSxzbGlkZVVwOlpuKCJoaWRlIiksc2xpZGVU +b2dnbGU6Wm4oInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNp +dHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oZSx0KXt2 +LmZuW2VdPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdGhpcy5hbmltYXRlKHQsZSxuLHIpfX0pLHYu +c3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJnR5cGVvZiBlPT0ib2JqZWN0Ij92LmV4dGVu +ZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fHYuaXNGdW5jdGlvbihlKSYmZSxkdXJhdGlvbjpl +LGVhc2luZzpuJiZ0fHx0JiYhdi5pc0Z1bmN0aW9uKHQpJiZ0fTtyLmR1cmF0aW9uPXYuZngub2Zm +PzA6dHlwZW9mIHIuZHVyYXRpb249PSJudW1iZXIiP3IuZHVyYXRpb246ci5kdXJhdGlvbiBpbiB2 +LmZ4LnNwZWVkcz92LmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTp2LmZ4LnNwZWVkcy5fZGVmYXVsdDtp +ZihyLnF1ZXVlPT1udWxsfHxyLnF1ZXVlPT09ITApci5xdWV1ZT0iZngiO3JldHVybiByLm9sZD1y +LmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXt2LmlzRnVuY3Rpb24oci5vbGQpJiZyLm9s +ZC5jYWxsKHRoaXMpLHIucXVldWUmJnYuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSx2LmVhc2lu +Zz17bGluZWFyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxzd2luZzpmdW5jdGlvbihlKXtyZXR1cm4u +NS1NYXRoLmNvcyhlKk1hdGguUEkpLzJ9fSx2LnRpbWVycz1bXSx2LmZ4PVluLnByb3RvdHlwZS5p +bml0LHYuZngudGljaz1mdW5jdGlvbigpe3ZhciBlLG49di50aW1lcnMscj0wO3FuPXYubm93KCk7 +Zm9yKDtyPG4ubGVuZ3RoO3IrKyllPW5bcl0sIWUoKSYmbltyXT09PWUmJm4uc3BsaWNlKHItLSwx +KTtuLmxlbmd0aHx8di5meC5zdG9wKCkscW49dH0sdi5meC50aW1lcj1mdW5jdGlvbihlKXtlKCkm +JnYudGltZXJzLnB1c2goZSkmJiFSbiYmKFJuPXNldEludGVydmFsKHYuZngudGljayx2LmZ4Lmlu +dGVydmFsKSl9LHYuZnguaW50ZXJ2YWw9MTMsdi5meC5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRl +cnZhbChSbiksUm49bnVsbH0sdi5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0 +OjQwMH0sdi5meC5zdGVwPXt9LHYuZXhwciYmdi5leHByLmZpbHRlcnMmJih2LmV4cHIuZmlsdGVy +cy5hbmltYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gdi5ncmVwKHYudGltZXJzLGZ1bmN0aW9uKHQp +e3JldHVybiBlPT09dC5lbGVtfSkubGVuZ3RofSk7dmFyIGVyPS9eKD86Ym9keXxodG1sKSQvaTt2 +LmZuLm9mZnNldD1mdW5jdGlvbihlKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlPT09dD90 +aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt2Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7 +dmFyIG4scixpLHMsbyx1LGEsZj17dG9wOjAsbGVmdDowfSxsPXRoaXNbMF0sYz1sJiZsLm93bmVy +RG9jdW1lbnQ7aWYoIWMpcmV0dXJuO3JldHVybihyPWMuYm9keSk9PT1sP3Yub2Zmc2V0LmJvZHlP +ZmZzZXQobCk6KG49Yy5kb2N1bWVudEVsZW1lbnQsdi5jb250YWlucyhuLGwpPyh0eXBlb2YgbC5n +ZXRCb3VuZGluZ0NsaWVudFJlY3QhPSJ1bmRlZmluZWQiJiYoZj1sLmdldEJvdW5kaW5nQ2xpZW50 +UmVjdCgpKSxpPXRyKGMpLHM9bi5jbGllbnRUb3B8fHIuY2xpZW50VG9wfHwwLG89bi5jbGllbnRM +ZWZ0fHxyLmNsaWVudExlZnR8fDAsdT1pLnBhZ2VZT2Zmc2V0fHxuLnNjcm9sbFRvcCxhPWkucGFn +ZVhPZmZzZXR8fG4uc2Nyb2xsTGVmdCx7dG9wOmYudG9wK3UtcyxsZWZ0OmYubGVmdCthLW99KTpm +KX0sdi5vZmZzZXQ9e2JvZHlPZmZzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vZmZzZXRUb3Asbj1l +Lm9mZnNldExlZnQ7cmV0dXJuIHYuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9m +ZnNldCYmKHQrPXBhcnNlRmxvYXQodi5jc3MoZSwibWFyZ2luVG9wIikpfHwwLG4rPXBhcnNlRmxv +YXQodi5jc3MoZSwibWFyZ2luTGVmdCIpKXx8MCkse3RvcDp0LGxlZnQ6bn19LHNldE9mZnNldDpm +dW5jdGlvbihlLHQsbil7dmFyIHI9di5jc3MoZSwicG9zaXRpb24iKTtyPT09InN0YXRpYyImJihl +LnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBpPXYoZSkscz1pLm9mZnNldCgpLG89di5j +c3MoZSwidG9wIiksdT12LmNzcyhlLCJsZWZ0IiksYT0ocj09PSJhYnNvbHV0ZSJ8fHI9PT0iZml4 +ZWQiKSYmdi5pbkFycmF5KCJhdXRvIixbbyx1XSk+LTEsZj17fSxsPXt9LGMsaDthPyhsPWkucG9z +aXRpb24oKSxjPWwudG9wLGg9bC5sZWZ0KTooYz1wYXJzZUZsb2F0KG8pfHwwLGg9cGFyc2VGbG9h +dCh1KXx8MCksdi5pc0Z1bmN0aW9uKHQpJiYodD10LmNhbGwoZSxuLHMpKSx0LnRvcCE9bnVsbCYm +KGYudG9wPXQudG9wLXMudG9wK2MpLHQubGVmdCE9bnVsbCYmKGYubGVmdD10LmxlZnQtcy5sZWZ0 +K2gpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLGYpOmkuY3NzKGYpfX0sdi5mbi5leHRlbmQo +e3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuO3ZhciBlPXRoaXNbMF0sdD10 +aGlzLm9mZnNldFBhcmVudCgpLG49dGhpcy5vZmZzZXQoKSxyPWVyLnRlc3QodFswXS5ub2RlTmFt +ZSk/e3RvcDowLGxlZnQ6MH06dC5vZmZzZXQoKTtyZXR1cm4gbi50b3AtPXBhcnNlRmxvYXQodi5j +c3MoZSwibWFyZ2luVG9wIikpfHwwLG4ubGVmdC09cGFyc2VGbG9hdCh2LmNzcyhlLCJtYXJnaW5M +ZWZ0IikpfHwwLHIudG9wKz1wYXJzZUZsb2F0KHYuY3NzKHRbMF0sImJvcmRlclRvcFdpZHRoIikp +fHwwLHIubGVmdCs9cGFyc2VGbG9hdCh2LmNzcyh0WzBdLCJib3JkZXJMZWZ0V2lkdGgiKSl8fDAs +e3RvcDpuLnRvcC1yLnRvcCxsZWZ0Om4ubGVmdC1yLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rp +b24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9mZnNldFBhcmVudHx8 +aS5ib2R5O3doaWxlKGUmJiFlci50ZXN0KGUubm9kZU5hbWUpJiZ2LmNzcyhlLCJwb3NpdGlvbiIp +PT09InN0YXRpYyIpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8aS5ib2R5fSl9fSksdi5lYWNo +KHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0 +aW9uKGUsbil7dmFyIHI9L1kvLnRlc3Qobik7di5mbltlXT1mdW5jdGlvbihpKXtyZXR1cm4gdi5h +Y2Nlc3ModGhpcyxmdW5jdGlvbihlLGkscyl7dmFyIG89dHIoZSk7aWYocz09PXQpcmV0dXJuIG8/ +biBpbiBvP29bbl06by5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbaV06ZVtpXTtvP28uc2Nyb2xs +VG8ocj92KG8pLnNjcm9sbExlZnQoKTpzLHI/czp2KG8pLnNjcm9sbFRvcCgpKTplW2ldPXN9LGUs +aSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLHYuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRo +OiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsbil7di5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50 +Om4sIiI6Im91dGVyIitlfSxmdW5jdGlvbihyLGkpe3YuZm5baV09ZnVuY3Rpb24oaSxzKXt2YXIg +bz1hcmd1bWVudHMubGVuZ3RoJiYocnx8dHlwZW9mIGkhPSJib29sZWFuIiksdT1yfHwoaT09PSEw +fHxzPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9u +KG4scixpKXt2YXIgcztyZXR1cm4gdi5pc1dpbmRvdyhuKT9uLmRvY3VtZW50LmRvY3VtZW50RWxl +bWVudFsiY2xpZW50IitlXTpuLm5vZGVUeXBlPT09OT8ocz1uLmRvY3VtZW50RWxlbWVudCxNYXRo +Lm1heChuLmJvZHlbInNjcm9sbCIrZV0sc1sic2Nyb2xsIitlXSxuLmJvZHlbIm9mZnNldCIrZV0s +c1sib2Zmc2V0IitlXSxzWyJjbGllbnQiK2VdKSk6aT09PXQ/di5jc3MobixyLGksdSk6di5zdHls +ZShuLHIsaSx1KX0sbixvP2k6dCxvLG51bGwpfX0pfSksZS5qUXVlcnk9ZS4kPXYsdHlwZW9mIGRl +ZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCYmZGVmaW5lLmFtZC5qUXVlcnkmJmRlZmluZSgi +anF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB2fSl9KSh3aW5kb3cpOw== +` +)